第一二章知识点归纳
- 系统编程大致内容
- 动态数据库结构
- 进程概念和进程管理
- 并发编程
- 定时器和定时功能
- 信号.信号处理和进程间通信
- 文件系统
- TCP/IP和网络编程
- 关于Unix/Linux版本信息
Unix系统诞生于20世纪70年代早期,是一种通用的操作系统,大多数Unix系统都是专有的,并且与特定的硬件平台相关联,出现的各种版本有 AT&T Unix;Berkeley Unix;HP Unix;IBM Unix;Sun Unix。
Linux系统是一个类Unix系统,从某种意义上讲,它是由各种最为流行的Unix系统组合而成,出现的版本有Debian Linux; Ubuntu Liux; Linux Mint; 基于RPM的Linux; Slackware Linux。
3.虚拟机上的Linux
通过书上内容,我成功安装了一台Ubuntu版本的虚拟机。
通过sudo("超级用户执行")提高权限,下载文本编辑器emacs。
在下载时出现网络不可达问题,上网查找资料后更改了虚拟机设置的网络适配器,将网络连接模式由桥接网络更改为特定虚拟网络NAT模式,安装成功。
下载gcc
- 程序开发
(1)创建源文件。这里简单介绍了全局变量、局部变量、静态变量、自动变量和寄存器变量,通过t1.c文件中static int s;语句所定义的静态全局变量,不能被t2.c文件所引用,我大致明白了静态变量的含义.
(2)用gcc把源文件转换成二进制可执行文件。
(3)编译器gcc程序
首先预处理输出文件hello.i
将预处理文件hello.i汇编成hello.s文件
将汇编输出文件hello.s编译输出hello.o文件
将编译输出文件hello.o链接成最终可执行文件hello
(4)汇编代码说明
gcc生成的汇编代码由三部分组成:
- 入口代码:建立栈帧,在堆栈上分配局部变量和工作空间。
- 函数体代码:在AX寄存器中执行带有返回值的函数任务。
- 推出代码:释放堆栈空间并返回到调用者。
5.静态与动态链接
创建二进制可执行文件方式有两种,分别是静态链接和动态链接。
静态链接中,链接器将所有必要的函数库代码和数据纳入a.out文件中。
动态链接中,库函数未包含在a.out文件中,但是对此类函数的调用以指令形式记录在a.out文件中,可减小每个a.out文件的大小。
6.链接库
(1)静态链接库
. gcc -c mysum.c
# 将mysum.c编译为mysum.o
. ar rcs libmylib.a mysum.o
# 使用成员mysum.o创建静态链接库
. gcc -static t.c -L -lmylib
# 使用libmylib.a作为链接库静态编译链接t.c
. a.out
(2)动态链接库
. gcc -c -fPIC mysum.c
# 编译到位置独立代码mysum.o
. gcc -shared -o libmylib.so mysum.o
# 使用mysum.o创建共享的libmylib.so
. gcc t.c -L. -lmylib
# 使用共享库libmylib.so生成a.out
. export LD_LIIBRARY_PATH=./
# 若要运行a.out,必须导出LD_LIBRARY=/
a.out
# 运行a.out.ld将加载libmylib.so
7.makefile
make是一个程序,自动有选择地执行编译链接,一个make文件由一系列目标项、依赖项和规则组成
(1)创建一个名为mk1的makefile
myt: type.h t.c mysum.c
gcc-o myt t.c mysum.c
(2)使用mk1作为makefile运行make
make -f mk1
(3)再次运行make命令,make不会再次构建目标,因为在上次构建后没有任何文件更改
8.gdb调试工具
通过man gdb命令显示gdb手册页
通过代码设置断点
b main
b sub
b 10
在emacs中调试
在终端gdb中调试
chatgpt苏格拉底挑战
针对系统编程知识点进行苏格拉底挑战
针对Unix程序开发步骤知识点进行苏格拉底挑战