Unix/Linix系统编程第二章学习笔记
Unix/Linix系统编程第二章学习笔记
作者:20191322wyl
Linux中的文本编辑器
vim
vim有三种模式,分别是:
- 命令模式:用于输入命令
- 插入模式:用于输入和编辑文本
- 末行模式:用于保存文件并退出
vim启动时,处于默认的命令模式,此时移动光标的命令键如下:(也可使用箭头键来控制)
h:将光变向左移动一个字符
l:光标向右移动一个字符
j:将光标向下移动一行
k:将光标向上移动一行
- (联想记忆:类似于wasd按键,平时玩游戏的上下左右,只需把k的位置联想到上面“w”的位置就行
用户可以通过输入“i”或“a”将vim切换到插入模式
i:切换到插入模式,插入文本
a:切换到插入模式,追加文本
在命令模式下输入“:”进入末行模式
:w 写入(保存)文件
:q 退出vim
:wq 保存并退出
:q! 不保存并退出
gedit
gedit是GNOME桌面默认环境的文本编辑器
emacs
emacs支持关键词搜索
使用文本编辑器
emacs
- emacs菜单
- emacs提供了一个集成开发环境,可以编译,运行,调试程序
程序开发
程序开发步骤
-
创建源文件
-
用gcc把源文件转换成二进制可执行文件
此操作主要包含三个步骤
- 将c源文件转换为汇编代码文件。即.c到.s
- 把汇编代码转换成目标代码。即.s 到 .o
- 链接,j将.o文件和必要的库函数组成单一的二进制可执行文件
静态与动态链接
动态链接库(DLL)
共享库(.so 文件)
可执行文件格式
- 二进制可执行平面文件
- a.out可执行文件
- ELF可执行文件:linux系统中默认的二进制可执行文件
a.out文件的内容
-
文件头
tsize = 代码段大小 dsize = 包含初始化全局变量和初始化静态局部变量的数据段的大小 bsize = 包含未初始化全局变量和未初始化静态局部变量的bss段的大小 total_size = 加载的a.out文件的总大小
-
代码段
-
数据段
-
符号表
程序执行过程
- 读取a.out文件头
- sh从总大小中分配一个内存区给执行映像
- sh放弃旧映像,执行新映像
- 执行从crt0.o开始,调用main(),将argc和argv作为参数传递给main()
程序终止
- 正常终止
- 异常终止
C语言中的函数调用
ctr0.o --> main() --> A(par_a) --> B(par_b) --> C(par_c)
C语言程序与汇编代码的链接
用汇编代码编程
- 将c代码编译成汇编代码
- 汇编代码说明
用汇编语言实现函数
从汇编中调用c函数
链接库
静态链接库
动态链接库
makefile
一个makefile文件由一系列目标项、依赖项、和规则组成
当make程序读取makefile时,它通过比较依赖项列表中源文件的时间戳来确定要构建哪些目标项。如果任何依赖项在上次构建后有较新的时间戳,make将执行与目标有关的规则
GDB调试工具
- GDB是一个交互式调试工具,可以调用C、C++和其他几种语言编写的程序
- 在linux系统中,
man gdb
命令显示gdb的手册页,其中提供了如何使用GDB的简要说明 - GDB是一个功能强大的调试工具,使用非常简单
C语言结构体
- 定义C语言结构体时,该结构体的每个字段都必须具有一个编译器已经的类型,但自引用指针除外
- 每个C语言结构体数据对象都分配了一个连续内存块
- 一个结构体的大小可以由
sizeo(struct type)
确定 - C语言联合体与结构体类似,定义联合体时只需将struct替换成关键字union
链表、树
链表
- 链表操作
- 链表遍历
- 搜索链表
- 插入操作
- 优先级队列
- 删除操作
- 循环链表
- 双向链表
树
- 二叉搜索树
- 二叉树遍历算法
- 深度优先遍历算法
- 广度优先遍历算法
- Unix/Linux文件操作树