一、知识点归纳
第一章:引言
- 系统编程课程的目的:
(1)教授学生计算机系统软件方面的广博知识以及高级编程技巧,使其能够与操作系统内核交互,从而有效利用系统资源来开发应用软件;
(2)为学生打下扎实的专业基础,以便在操作系统、嵌入式系统、数据库系统、数据库系统、数据挖掘、人工智能、计算机网络、网络安全、分布式和并行计算等计算机科学/工程领域继续深造。
- 系统编程的作用
系统编程是计算机科学和计算机工程教育不可或缺的一部分。
- 关于Unix
概念:Unix是一种通用操作系统,诞生于20世纪70年代早期,由肯·汤姆森和丹尼斯·里奇开发。
分类:AT&T Unix、Berkeley Unix、HP Unix、IBM Unix、Sun Unix
下面是对各种Unix系统的介绍:
名称 |
介绍 |
总结 |
AT&T Unix |
20世纪80年代末,由美国电话电报公司开发,最终发布了AT&T System V Unix。System V Unix是一个单处理器系统,在20世纪80年代后期,该系统被拓展为多处理器版本。 |
可以看出,大多数Unix系统都是专有的,并且与特定的硬件平台相关联。 |
Berkeley Unix |
指1977年至1985年间由加州大学伯克利分校的伯克利软件发行中心开发的一组Unix操作系统变体。BSD Unix最重要的贡献是实现了TCP/IP协议族和套接字接口,作为一种标准的组网方式。 |
|
HP Unix |
由惠普公司开发的专有Unix操作系统,第一版发布于1984年。HP-UX的独特功能包括可代替Unix标准rwx文件权限的用于大型文件系统和访问控制表的内置逻辑卷管理器。 |
|
IBM Unix |
AIX是IBM为其多个计算机平台开发的一系列专有Unix操作系统。AIX最初是为IBM 6150 RISC工作站而开发,现可支持各种硬件平台。 |
|
Sun Unix |
最初是Sun公司开发的一款Unix操作系统。自2010年1月起,该系统更名为Oracle Solaris。Solaris以其可拓展性而闻名,特别是在SPARC系统上。它支持由Oracle和其他供应商提供的各种基于SPARC和基于x86的工作站和服务器。 |
- 关于Linux
定义:Linux是一个类Unix系统。它最初是林纳斯·托瓦兹在1991年为基于Intel x86的个人计算机开发的一个实验性内核。Linux的一个重要里程碑发生在20世纪90年代末,当时,它与GUN相结合,纳入了许多GUN软件,如GCC编辑器、GNU emacs编辑器和bash等,极大地促进了Linux的进一步发展。 Linux包含其他Unix系统的许多特性。在某种意义上,它是由各种最为流行的Unix系统组合而成。在很大程度上,Linux是兼容POSIX标准的。
版本:Debian Linux、Ubuntu Linux、Linux Mint、基于RPM的Linux、Slackware Linux
下面是对各类Linux系统的介绍:
名称 |
介绍 |
Debian Linux |
Debian是专注于免费软件的Linux发行版,可支持很多软件平台。Debian发行版采用.deb包格式和dgpk包管理器及其前端。 |
Ubuntu Linux |
Ubuntu是基于Debian的Linux发行版,有多个官方发行版。 |
Linux Mint |
Linux Mint是基于Debian 和Ubuntu的社区主导型Linux发行版。 |
基于RPM的Linux |
Red Hat Linux和SUSE Linux 是最早使用RPM文件格式的主要发行版,目前仍有一些软件包管理系统在使用这些格式。 |
Slackware Linux |
Slackware Linux发行版以高度可定制而著称,专注于通过尖端的软件和自动化工具来提供维护便捷性和可靠性。 |
- Linux使用
(1)Linux内核映像
在典型的Linux系统中,Linux内核映像位于/boot目录中。可启动的Linux内核映像名为 vmlinuz-generic-VERSION_NUMBER,initrd是Linux内核的初始ramdisk映像。一个可启动的Linux内核的初始ramdisk映像。
一个可启用的Linux内核映像由三部分组成:|BOOT|SETUP|linux kernel|
- Unix/Linux文件系统组织
Unix/Linux文件系统采用树形组织结构
文件类型分为两种,分别是目录文件以及非目录文件,非目录文件、符号链接文件。
目录文件:一个目录可能包含其他目录和(非目录)文件。
非目录文件:非目录文件可以进一步划分为常规文件、特殊文件(字符特殊文件、块特殊文件)。
(1)常规文件:包含普通文本或包含可执行的二进制代码。
(2)特殊文件:特殊文件时/dev目录中的条目。
符号链接文件:属于常规文件,其内容为其他文件的路径名。因此,这些文件是指向其他文件的指针。例如,Linux命令 ln -s aVeryLongFileName myLink,可创建一个符号链接文件“myLink”,指向“aVeryLongFileName”。
Unix/Linux文件系统树的根节点(用“/”符号表示)称为根目录,或简称为根。文件系统树的每个结点都有以下表单的路径名指定:
/a/b/c/d OR a/b/c/d
以“/”开头的路径名为绝对路径名,反之则为相对于进程当前工作目录(CWD)的相对路径名。
pwd可以打印CWD的绝对路径名
- Unix/Linux命令
下面列出了Unix/Linux中最常用的命令:
ls:ls dirname:列出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文件
- Linux手册页
9. Ubuntu Linux系统管理
(1)用户账户:当用户使用登录名和密码登录后,登录进程将通过获取用户的gid和uid来转换成用户进程,并将目录更改为用户的homeDir,然后执行列出的initialProgram,该程序通常为命令解释程序sh。
(2)sudo命令:在Ubuntu里,sudo(“超级用户执行”)允许用户以另一个用户(通常是超级用户)的身份执行命令,为确保用户能够发出sudo,只需在sudoers文件中添加一行:username ALL(ALL) ALL。
第二章:编程背景
- Linux中的文本编辑器
(1)Vim
Vim是Linux的标准内置编辑器。它是Unix原始默认vi编辑器的改进版本。与其他大多数编辑器不同,vim有3种不同的操作模式,分别是命令模式、插入模式、末行模式。
下面介绍一下这三种模式:
命令模式:用于输入命令
插入模式:用于输入和编辑文本
末行模式:用于保存文件并退出
移动光标的命令键:
h 左移一个字符 l:右移一个字符
j:下移 k:上移
插入模式:
i:插入文本 a:追加文本 esc:退出
输入“:”进入末行模式,将文本保存为文件或退出vim:
:w:写入(保存)文件
:q:退出vim
:wq:保存并退出
:q!:不保存更改,强制退出
(2)WYSIWYG编辑器
- 使用文本编辑器
(1)emacs
emacs是一款强大的文本编辑器,可在多个不同的平台上运行。最受欢迎的emacs是GNU Emacs,可在大多数Linux发行版中使用。
3.程序开发
程序开发步骤:
执行程序的开发步骤如下:
(1)创建源文件:使用文本编辑器创建一个或多个程序源文件。在系统编程中,最重要的编程语言是C语言和编程语言。C语言程序中的变量可分为全局变量、局部变量、静态变量、自动变量和寄存器变量。
(2)用gcc把源文件转换成二进制可执行文件,如:gcc t1.c t2.c 生成一个二进制可执行文件,文件名为a.out。在Linux中,cc链接到gcc,所以它们是一样的。
(3)gcc是什么?gcc是一个程序,它包含三个主要步骤,如图所示
第一步:将C源文件转换为汇编代码文件。
第二步:把汇编代码转换成目标代码。
第三步:链接。一个程序可能包含多个.o文件,这些文件相互依赖。
可执行文件格式:
虽然默认的二进制可执行文件名为a.out,但实际文件格式可变。其中包括
(1)二进制可执行平面文件
(2)a.out可执行文件
(3)ELF可执行文件(更适合动态链接)
a.out文件的内容:
(1)二进制可执行平面文件
(2)代码段
(3)数据段
(4)符号表
程序执行过程:
(1)读取a.out文件头,以确定所需的总内存大小,包含栈空间大小:
TotalSize = _brk +stackSize
(2)sh从总大小中分配一个内存区给执行映像
(3)sh放弃旧映像,开始执行新映像
(4)执行从crt0.o开始,调用main()
程序终止:
(1)正常终止
(2)异常终止
4.C语言中的函数调用
(1)每个CPU都有以下寄存器或同等寄存器,括号中的条目表示x86CPU的寄存器:
PC(IP):指向CPU要执行的下一条指令。
SP(SP):指向栈顶
FP(BP):指向当前激活函数的栈帧
返回值寄存器(AX):函数返回值的寄存器。
当sub()执行C语句return x+y+u+v时,他对表达式求值,并将结果值放入返回寄存器(AX)。
- C语言程序与汇编代码的链接
(1)汇编代码说明
GCC生成的汇编代码由三部分组成:
①入口代码:又叫作prolog,它建立栈帧,在堆栈上分配局部变量和工作空间
②函数体代码:在AX寄存器中执行带有返回值的函数任务
③退出代码:又叫做epilog,它释放堆栈空间并返回到调用者
- 链接库
在Linux中,有两种链接库:用于静态链接的静态链接库和用于动态链接的动态链接库。
静态链接库:
在编译链接过程中,-L指定链接库路径(当前目录),-l指定链接库。注意,链接库(mylib)未指定前缀lib和后缀.a。
动态链接库:
- Makefile
(1) makefile格式:一个make文件由一系列目标项、依赖项和规则组成
- GDB调试工具
1、创建makefile:
t: t.c
gcc -g -o t t.c
然后使用RMACS编辑c语言源文件。
2、编译源代码
打开Tools菜单,选择编译或
gccc -g -o t t.c
3、启动GDB
4、多窗口GDB
5、附加GDB命令
C语言程序中的常见错误:
1、使用任何指针时,程序员必须确保指针部位NULL或被设置为执行有效的内存地址
2、数组下标越界
3、字符串指针和char数组使用不当
4、assert宏的用法
- C语言结构体
next:指向下一个节点结构体的指针
key:一个整数
name:一个由64个字符组成的数组
(1)定义结构体变量
struct node x,node;
NODE x,node;
(2) typedef struct node{
struct node *next;
int key key;
char name[2];
}attribute((packed,aligned(1))) NODE;
PACKED属性定义C语言结构体,这可以防止C编译器用额外字节填充字段
(3)联合体所有成员共享相同的存储区。
(4)可扩充C语言结构体:要使用这类结构体,用户必须为实际结构体分配所需要的内存。
10.链表处理
单向链表是一种由一系列节点组成的数据结构
链表操作:
链表最常见的操作类型为:构建、遍历、搜索、插入、删除、重新排序
- 树和Linux
mkdir 路径名:为给定的路径名创建一个新目录。
rmdir 路径名:如果目录为空,则删除该目录
creat 路径名:创建一个FILE结点。
save 文件名:将当前文件系统树保存为文件
reload 文件名:从一个文件构造一个文件系统树
menu:显示有效命令菜单
quit:保存文件系统树,然后终止程序