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:释放共享库
dlopen:打开共享库
dlsym:解析共享库,获取符号地址
dlclose:释放共享库
3.3 内存管理
3.3.1 linux分配、释放虚拟空间的函数
- mmap()分配空间
-
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乘法表
for i in `seq 9`
do
for j in `seq 9`
do
[ $j -le $i ] && echo -n "$j x $i= `echo $(($j*$i))` "
done
echo""
done
4.34 shell中函数有返回值吗?如果有如何返回?
- shell 中可以通过return返回数据
- 但是这个数据只能在0-255之间
- 如果超过通过字符串返回
5.ELF文件
5.1 Linux下ELF文件格式
- 可执行文件(.exe .out)
- 可重定位目标文件(.o)
- 共享目标文件(.so)
-
5.2 ELF文件分成哪几部分?
ELF Header 文件头
- Program Header Table 程序头表
- Section 区段
-
5.3 Linux 共享库和静态库
共享库后缀:.so
-
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 | 无符号小整数 |