3.1 线程操作

3.1.1 linux线程函数需要包含哪个头文件?

pthread.h

3.1.2 Linux创建线程的函数时哪个?

pthread_create

3.1.3 一个线程创建后,需要使用什么方法回收资源?

调用pthread_join,在线程中调用pthread_detached

3.1.4 linux使用哪些方法解决线程同步问题?

互斥锁、信号量、条件变量

3.1.5 Linux下TCP创建流程

服务端:socket-bind-listen-accept-send/recv-close
客户端:socket-connect-send/recv-close

3.2 动态链接

3.2.1 gcc静态编译程序需要加入什么参数:-static

3.2.2 动态链接库加载方式有几种?

  • 链接时定位(隐式链接)
  • 运行时载入(显示连接)

3.2.3 对显示链接方式调用共享库需要哪些函数及头文件?

include
dlopen:打开共享库
dlsym:解析共享库,获取符号地址
dlclose:释放共享库

3.3 内存管理

3.3.1 linux分配、释放虚拟空间的函数

  • mmap()分配空间
  • munmap()释放空间

    3.3.2 linux修改属性的api: mprotect()

  • mprotect函数地址:必须是内存分页的起始位置,修改的长度也必须是分页内存大小的倍数

  • brk 分配堆空间
  • sbrk 获取堆指针
  • C语言分配堆空间 malloc
  • C语言释放对空间 free

3.3.3 虚拟内存的属性

PROT_EXEC 可执行
PROT_READ 可读
PROT_WRITE 可写
PROT_NONE 无法访问

3.4 信号

3.4.1 信号是一个异步事件

3.4.2 系统定好的信号有哪些?

  • SIGHUP 1 挂起
  • SIGINT 2 中断 ctrl+c
  • SIGKILL 9 关闭进程
  • SIG ALRM 超时警告
  • SIGABORT 进程异常终止
  • SIGQUIT 终端退出
  • 查看系统信号 kill -

3.4.3 注册信号处理函数有哪些?

  • signal()
  • sigaction()

3.4.4 取消一个已经注册的信号处理器?

使用signal函数的第二个参数SIG_DEF,恢复信号默认处理方法
signal(SIGALRM,SIG_DEF)

3.4.5 发送信号:kill

4.1管道

4.11 重定向中,数字0.1.2 分别代表什么?

  • 0 stdin 标准输入
  • 1 stdout 标准输入
  • 2 stderr 标准错误输出

4.12 将ps显示的内容写入到process.txt 文件中?

  • ps -aux >process.txt 写到文件中(覆盖型)
  • ps -aux >>process.txt 写到文件末尾

4.13 利用管道找到firefox进程

  • ps -aux |grep firefox

4.2 shell基本编程

4.21 shell中变量命名规则

不能使用关键字,其他与C语言相同

4.22 shell中获取字符串的长度

  • 在变量前加#
  • string=”hello”
  • echo ${#string}

4.23 在shell中 shell指令 echo pwd

4.24 常用数组相关shell 命令

  • echo ${!arr[*]} 罗列数组下标
  • echo ${#arr[*]} 数组元素个数
  • echo ${arrayName[2]} 访问数组中某个元素
  • name=“xiaoming”定义变量
  • echo ${name1} 查询显示变量的值
  • echo ${name}${age} 凭借数组
  • echo name={1 2 3 4} 定义数组

4.25 在shell脚本中如何传递给shell脚本的参数,参数个数?

  • $#:传递给shell脚本的参数个数
  • $1:获取第一个参数
  • $1…$n:来获取其他参数

4.26 shell中如何接收用户输入?

使用命令 read xxxx,将接收的字符串保存到变量中

4.27 bash中支持哪些算数运算方式?

  • expr命令
  • let 命令
  • $(()) 命令
  • $[ ] 命令

4.31 shell编程中条件测试语法

  • test命令
    • 测试一个文件是否存在 test -e ${a}
    • test ${a} -gt ${b}
  • []命令

4.32 shell中的循环方式

  • while
  • for
  • until

4.33 循环打印9*9乘法表

  1. for i in `seq 9`
  2. do
  3. for j in `seq 9`
  4. do
  5. [ $j -le $i ] && echo -n "$j x $i= `echo $(($j*$i))` "
  6. done
  7. echo""
  8. done

4.34 shell中函数有返回值吗?如果有如何返回?

  • shell 中可以通过return返回数据
  • 但是这个数据只能在0-255之间
  • 如果超过通过字符串返回

5.ELF文件

5.1 Linux下ELF文件格式

  • 可执行文件(.exe .out)
  • 可重定位目标文件(.o)
  • 共享目标文件(.so)
  • 核心转储文件(core)

    5.2 ELF文件分成哪几部分?

  • ELF Header 文件头

  • Program Header Table 程序头表
  • Section 区段
  • Section Header Table 区段表

    5.3 Linux 共享库和静态库

  • 共享库后缀:.so

  • 静态库后缀:.a

    5.4 学习ELF文件的工具

  • readelf

  • objdump
  • 010 editor

5.5 ELF文件头

  • Elf32_Addre_entry 程序入口
  • “ELF”7F 45 4C 46 魔数标志
  • ELF32_Ehdr->e_ident[4] (e_machine)
    • 1 表示 32位
    • 2 表示 64位

5.7 如何在ELF中找到节表字符串表?

  • 在ELF头中保存e_shstrndx为节表字符串下标
  • 通过它可找到节表字符串表

5.8 符号表保存的是?

符号表保存符号(函数名和变量名等)

5.9 什么是重定位?

  • 重定位是将符号引用与符号定义进行连接的过程
  • 例如在main中 使用了printf函数,但是此时并不知道printf函数地址,需要动态加载后才能确定,所以会将printf符号记录起来

5.10 节表类型为什么时,指向重定位表?

  • 重定位表类型SHT_REL/SHT_RELA

5.11 程序段表的结构体类型是

Elf32_Phdr

5.12 怎么找到程序段表的位置?

通过ELF文件头中的e_phoff字段找到

5.13 动态链接表位于什么位置?

  • 动态链接表有两个,在节表中和程序段表都存在,保存程序动态链接过程重要数据
  • 节表类型: SHT_DYNAMIC
  • 程序段表类型:PT_DYNAMIC

5.14 首先,我们先来看下32位ELF文件中常用的数据格式:

名称 大小 对齐 目的
Elf32_Addr 4 4 无符号程序地址
Elf32_Half 2 2 无符号中等整数
Elf32_Off 4 4 无符号文件偏移
Elf32_SWord 4 4 有符号大整数
Elf32_Word 4 4 无符号大整数
unsigned char 1 1 无符号小整数