学习笔记1
第一章
- 本书目标
- 强化编程背景知识
- 动态数据结构的应用
- 进程概念和进程管理
- 并发编程
- 定时器和定时功能
- 信号、信号处理和进程间的通信
- 文件系统
- TCP/IP和网络编程
- 关于Unix
- AT&T Unix
- Berkeley Unix
- HP Unix
- IBM Unix
- Sun Unix
- 关于Linux
- Debain Linux
- Ubuntu Linux
- Linux Mint
- 基于RPM的Linux
- Slackware Linux
- 虚拟机上的Linux
- VirtualBox
- VMware
- 我使用的虚拟机
- 我使用的虚拟机
- 双启动Slackware和Ubuntu Linux
- Unix/Linux文件系统组织
- 文件类型
- 目录文件
- 非目录文件
- 常规文件(REGULAR)
- 特殊文件(SPECIAL)
- 字符特殊文件:字符I/O,如/dev/tty0等。
- 块特殊文件:块I/O,如/dev/had等。
- 其他类型,如网络(套接字)特殊文件等。
- 符号链接文件:属于常规文件,其内容为其他文件的路径名。例如:
ln -s aVeryLongFileName myLink
- Unix/Linux文件树
- bin (普通用户命令)
- boot (内核镜像)
- dev (设备文件)
- etc (系统维护文件)
- home (用户主目录)
- lib (链接库)
- proc (系统信息相关的文件)
- sbin (超级用户命令)
- tmp
- bin (命令)
- include (头文件)
- lib (库文件)
- usr
- local
- man (用户手册)
- X11 (X-Window)
- 文件路径名
- Unix/Linux文件树的根节点(符号‘/’)为根目录。
- 以'/'为开头的路径名为绝对路径名,反之则为相对于进程当前工作目录
- Unix/Linux命令
- 文件类型
ls:列出CWD的绝对路径名
cd dirname:更改目录
pwd:打开CWD的绝对路径名
touch filename:更改文件名和时间戳
cat filename:显示文件内容
cp src dest:复制地址
mv src dest:移动或重命名文件
mkdir dirname:创建目录
rmdir dirname:移除目录
rm filename:移除或删除文件
ln oldfile newfile:在文件之间创造链接
find:搜索文件
grep:搜索文件中包含模式的行
ssh:登录到远程主机
gzip filename:将文件压缩成.gz文件
gunzip file.gz:解压.gz文件
tar -zcvf file.tgz:从当前目录创建压缩tar文件
tar -zxvf file.tgz:从.tgz文件中解压文件
man:显示在线手册页
zip file.zip filenames:将文件压缩成.zip文件
- unzip file.zip:解压.zip文件
- Ubuntu Linux系统管理
- 用户账户
- 添加新用户
- sudo命令
第二章
-
Linux中的文本编辑器
- vim
- 命令模式:用于输入命令
- vim启动时的默认模式
- i:切换到插入模式,插入文本
- a:切换到插入模式,追加文本
- ':':进入末行模式
- 插入模式:用于输入和编辑文本
- 末行模式:用于保存文本和退出
- 命令模式:用于输入命令
- gedit
- emacs
- 编写源文件
- 编写源文件
- vim
-
程序开发
- 程序开发步骤
- 苏格拉底挑战
- 创建源文件
- 用gcc把源文件转换成二进制可执行文件
- 把C源文件转化成汇编代码文件
- 把汇编代码转化成目标代码
- 链接
- 苏格拉底挑战
- 苏格拉底挑战
- 动态链接优点
- 可减小每个a.out文件的大小
- 许多执行程序可在内存中共享相同的库函数
- 修改库函数不需要重新编译源文件
- 可执行文件格式
- 二进制可执行平面文件:仅包含可执行代码和初始化数据。
- a.out可执行文件:传统的a.out文件包含文件头,然后就是代码段、数据段和bss段
- ELF可执行文件:可执行的链接格式包含一个或多个程序段
- a.out文件的内容
- 文件头
- tsize=代码段大小
- dsize=包含初始化全局变量和初始化静态局部变量的数据段大小
- bsize=包含未初始化全局变量和未初始化静态局部变量的bss段大小
- total_size=加载的a.out文件的总大小
- 代码段:也称正文段,包含程序的可执行代码
- 数据段:数据段包含初始化全局变量和初始化静态数据
- 符号段:可选,仅为运行调试所需
- 文件头
- 程序执行过程
- 读取a.out文件,以确定所需总内存大小
- sh从总大小中分配一个内存区给执行映像
- 然后sh放弃旧映像,开始执行新映像
- 执行从crt0.o开始,调用main(),将argc和argv作为参数传给main()。
- 程序终止
- 正常终止
- 异常终止
- 程序开发步骤
-
C语言中的函数调用
- long jump
-
C语言程序与汇编代码的链接
- gcc生成的汇编代码
- 入口代码
- 函数体代码
- 退出代码
- gcc生成的汇编代码
-
链接库
- 静态链接库
gcc -c mysum.c
ar rcs libmylib.a mysum.o
gcc -static t.c -L. -lmylib
a.out
- 动态链接库
gcc -c -fPIC mysum.c
gcc -shared -o libmylib.so my sum.o
gcc t.c -L -lmylib
export LD_LIBRARY_PATH=./
a.out
- 静态链接库
-
makefile
- makefile格式
- 目标项
- 依赖项
- makefile格式
-
GDB调试工具
- 在emacs IDE中使用GDB
- 在X—Windows下,打开一个伪终端,使用emacs创建makefile
- 编译源代码
- 启动GDB
- 多窗口GDB
- Gud-t:用户命令和GDB消息的GDB缓冲区。
- t.c:显示执行进度的程序源代码。
- 栈帧:显示函数调用序列的栈帧。
- 本地寄存区:显示当前执行函数中的局部变量。
- 输入/输出
- 断点:显示当前断点设置
- 附加GDB命令 :
- 在emacs IDE中使用GDB
清除断点:
clear line#:清除 line#的断点。
clear name:清除函数(名字为name)中的断点。
更改变量值:
set vara=100:设变量a为100。
set varb=200:设变量b为200,以此类推
监视变量值改变:
watch c:监视变量c值改变:每当c的值变化时,将显示其旧值和新值
回溯追踪(bt):
btstackFrame#:回溯追踪栈顿。
遇到的问题
对gcc过程还不是很理解