知识点总结
第一章
关于本书
- 研究Unix/Linux系统编程的专著,涵盖Unix/Linux的所有基本组件,包括进程管理、并发编程、定时器和时钟服务、文件系统、网络编程和MySQL数据库系统。
本书目标
- 强化学生编程背景知识
- 动态数据结构的应用
- 进程概念和进程管理
- 并发编程
- 定时器和定时功能
- 信号、信号处理和进程间通信
- 文件系统
- TCP/IP和网络编程
关于Unix
- AT&T Unix
- Berkeley Unix
- HP Unix
- IBM Unix
- Sun Unix
关于Linux
- Debian Linux
- Ubuntu Linux
- Linux Mint
- 基于RPM的Linux
- Slackware Linux
虚拟机上的Linux
- VirtualBox
- VMware
Unix/Linux命令
Ubuntu Linux系统管理
- 添加新用户
第二章
Linux的文本编辑器
- vim
- 命令模式:用于输入命令
- 插入模式:用于输入和编辑文本
- 末行模式:用于保存文件并退出
- gedit
- emacs
使用emacs
程序开发步骤
- 创建源文件
- 全局变量
- 局部变量
- 静态变量
- 自动变量
- 寄存器变量
- 易失性变量
- 用gcc把源文件转换成二进制可执行文件
- gcc三个主要步骤
- 第一步:将C源文件转换为汇编代码文件
- 第二步:把汇编代码转换成目标代码,生成的.o文件称为目标代码。每个.o文件包含:
- 一个文件头
- 一个代码段
- 一个数据段
- 一个BSS段
- 第三步:链接
静态与动态链接
- 动态链接的主要优点
- 可减小每个a.out文件的大小
- 许多执行程序可在内存中共享相同的库函数
- 修改库函数不需要重新编译源文件
可执行文件格式
- 二进制可执行平面文件:仅包含可执行代码和初始化数据。便于直接执行。
- a.out可执行文件:包含文件头,代码段,数据段和bss段
- ELF可执行文件:更适合动态链接
程序执行过程
在类Unix操作系统中,在sh命令行a.out one two three执行a.out文件,以标记字符串作为命令行参数。为执行命令,sh创建一个子进程并等待改子进程终止。子进程运行时,sh使用a.out文件执行新的执行映像。
- 读取a.out文件头,以确定所需的总内存大小,包括堆栈空间大小
- sh从总大小中分配一个内存区给执行映像
- sh放弃旧映像,开始执行新映像
- 执行从crt0.o开始,调用main,将argc和argv作为参数传递给main
程序终止
- 正常终止:若程序执行成功,main最终会返回到crt0.o,调用库函数exit(0)来终止进程
- 异常终止
C语言中的函数调用
- long jump
C语言与汇编代码的链接
用汇编代码编程
- 将C代码编译成汇编代码
- 汇编代码说明,gcc生成的汇编代码由三部分组成:
- 入口代码
- 函数体代码
- 退出代码
用汇编语言实现函数
从汇编中调用C函数
链接库
- 静态链接库
- 动态链接库
makefile
- makefile格式:一个make文件由一系列目标项、依赖项、和规则组成
- make程序:当make程序读取makefile时,它通过比较依赖项列表中源文件的时间戳来确定要构建哪些目标项
GDB调试工具
- 在emacs IDE中使用GDB
- 源代码:在X—Windows下,打开一个伪终端,使用emacs创建makefile
- 编译源代码
- 启动GDB
- 多窗口GDB
- Gud-t:用户命令和GDB消息的GDB缓冲区。
- t.c:显示执行进度的程序源代码。
- 栈帧:显示函数调用序列的栈帧。
- 本地寄存区:显示当前执行函数中的局部变量。
- 输入/输出
- 断点:显示当前断点设置
- 附加GDB命令 :
C语言中常见错误
- 未初始化的指针或含有错误值的指针
- 数组下标越界
- 字符串指针和char数组使用不当
- assert宏
- 在程序代码中使用fprintf和getchar
苏格拉底提问
问题及解答
使用virtualbox无法打开Linux虚拟机,提示:No bootable medium found
解决思路:
通过询问AI可知,应该是我的虚拟机启动盘出现了问题,然后检查发现我的启动盘中缺少提到的几种镜像文件,可能是以前误删,最后我重新设置了VDI的镜像文件,解决了问题。