全书课件:Linux高级程序设计_第1页
全书课件:Linux高级程序设计_第2页
全书课件:Linux高级程序设计_第3页
全书课件:Linux高级程序设计_第4页
全书课件:Linux高级程序设计_第5页
已阅读5页,还剩432页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Linux高级程序设计(第二版)2021-10-112Linux应用编程主要知识点“一切都是文件”。 (1)磁盘文件(普通文件,链接文件,目录)管理。 本书第4,5,6章。 (2)进程及进程间通信。 本书第7,8,9章。 (3)线程及线程间同步。 本书第10,11章。 (4)网络编程。 本书第12,13,14,15章。 其它:编程工具,编程环境。 本书第1,2,3章。2021-10-113磁盘文件管理主要内容 普通文件IO操作。 ANSIC文件IO。文件流及相关操作。 POSIX文件IO。文件描述符及相应操作。 目录文件管理。 目录流及目录流操作。 符号链接文件管理。 符号链接及操作。 磁盘文

2、件属性获取与磁盘文件属性修改。 目标: 能够实现cp命令,ls l等基本命令的源代码编写。2021-10-114进程及进程间通信机制主要知识点进程管理 创建 执行新代码 退出 等待进程间通信数据传递: 管道(有名,无名管道) IPC的消息队列 IPC共享内存同步 信号量异步 信号2021-10-115线程与线程同步基本知识点 线程基本操作 创建 退出 取消 等待 线程同步机制 互斥锁 读写锁 条件变量 线程信号灯 线程与信号2021-10-116网络编程知识点网络基础及支撑函数,工具 TCP/IP协议栈,数据封包拆包过程,TCP,UDP,IP包头 BSDTCP,UDP网络编程流程及API函数

3、地址处理函数,大小端问题,socket属性控制 域名解析TCP高级 阻塞与非阻塞处理 多路复用 信号驱动UDP高级 广播 组播网络服务器架设2021-10-117编程工具及编程环境知识点 编辑器,编译调试工具使用。 VIM GCC GDB Makefile 头文件,库文件的使用,库文件的创建。 错误,帮助信息的获取,编码规范要求。 段域加载,内存管理基础知识。第1章Linux下C语言开发环境Linux操作系统简介操作系统简介Linux开发初步开发初步 部分常用工具简介部分常用工具简介Linux下编码风格下编码风格2021-10-119GNU GNUs Not UNIX . 开始于1984年,旨

4、在发展一个类UNIX且为自由软件的完整操作系统:GNU系统。更精确地说,各种使用 Linux 作为内核的GNU操作系统应该被称为GNU/Linux系统 。 2021-10-1110POSIX 可移植操作系统接口(Portable Operating System Interface,缩写为POSIX是为了读音更像UNIX)。 2021-10-1111GPL(General Public License) 公共许可协议第1章Linux下C语言开发环境Linux操作系统简介操作系统简介Linux开发初步开发初步 部分常用工具简介部分常用工具简介Linux下编码风格下编码风格2021-10-1113

5、Linux下C程序标准 ANSI C POSIX标准2021-10-1114库函数和系统调用 2021-10-1115在线文档介绍 man手册 info手册2021-10-1116获取错误信息 在调用库函数或系统调用函数后,绝大多数情况下如果执行成功将返回0或者正确值;如果执行失败,返回-1,并把系统全局变量errno赋值,以指示具体的错误情况。 2021-10-1117打印错误提示信息 第1章Linux下C语言开发环境Linux操作系统简介操作系统简介Linux开发初步开发初步 部分常用工具简介部分常用工具简介Linux下编码风格下编码风格2021-10-1119tar打包器 2021-10

6、-1120Linux常用命令 Expand grep搜索字符串 find查找文件 常用键盘组合键命令 第1章Linux下C语言开发环境Linux操作系统简介操作系统简介Linux开发初步开发初步 部分常用工具简介部分常用工具简介Linux下编码风格下编码风格2021-10-1122Linux下编码风格 GNU编码规范 Linux内核编码规范第2章Linux下C语言开发工具 常用编辑工具常用编辑工具 GCC编译工具编译工具 Make工具与工具与Makefile文件文件 常用调试工具常用调试工具Linux库文件使用与创建库文件使用与创建 Autoconf/Automake自动化工具自动化工具 20

7、21-10-1124VIM编辑器 2021-10-1125配置文件 VIM的配置文件为“/.vimrc” cp /usr/share/vim/vim61/vimrc_example /.vimrc 添加内容到配置文件/.vimrc中2021-10-1126Source Insight工具 Source Insight是一个图形化的源代码查看工具(当然也可以做为编辑工具),如果一个项目的源代码较多,此工具可以很方便的查找出源代码之间的依赖关系,例如,某一个宏的定义位置,某一个自定义的数据类型的原始定义。 应用编程所用的头文件(主要位于/usr/include目录下)下载到Windows平台,从而

8、建立各文件间的关联,以便查找各函数声明,变量类型。第2章Linux下C语言开发工具 常用编辑工具常用编辑工具 GCC编译工具编译工具 Make工具与工具与Makefile文件文件 常用调试工具常用调试工具Linux库文件使用与创建库文件使用与创建 Autoconf/Automake自动化工具自动化工具 2021-10-1128编译C到可执行文件过程(1)预处理(也称预编译,Preprocessing):命令GCC首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含、预编译语句进行分析,使用-E参数。(2)编译(Compilation):调用cc进行编译,这个阶段根据输入文件生成以

9、.s为后缀的汇编文件,使用-s参数。(3)汇编(Assembly):汇编过程是针对汇编语言的步骤,调用as进行工作,将.S和.s为后缀的汇编语言文件经过预编译和汇编成以.o为后缀的目标文件,使用-c参数。(4)连接(Linking):当所有的目标文件都生成之后,调用ld来完成最后的关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排到可执行程序中恰当的位置上,同时,该程序所调用到的库函数也从各自所在的档案库中连到合适的地方,使用-o参数。2021-10-1129不同后缀所标识的程序语言及处理 2021-10-1130其它常用选项 -o output_filename:把文件输出到ou

10、tput_filename,这个名称不能和源文件同名。如果不给文件名,GCC就将文件输出到a.out。 -g:产生符号调试工具(GNU的Gdb)所必要的标准调试信息,要想对源代码进行调试,就必须加入这个选项。 -O:对程序进行优化编译、连接。采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样可以提高可执行文件的执行效率,但是,编译、连接的速度就相应地要慢一些。 -O2:比-O的优化级别更高,能更好的优化编译、连接。但整个编译、连接过程会更长。 -I dirname:在头文件的搜索路径列表中添加dirname目录,是在预编译过程中使用的选项。 -L dirname:在库文件的搜索路径

11、列表中添加dirname目录。2021-10-1131头文件搜索路径 第2章Linux下C语言开发工具 常用编辑工具常用编辑工具 GCC编译工具编译工具 Make工具与工具与Makefile文件文件 常用调试工具常用调试工具Linux库文件使用与创建库文件使用与创建 Autoconf/Automake自动化工具自动化工具 2021-10-1133Makefile优点 利用Make工具,可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序而言,使用make工具和makefile文件可以清晰地理顺各个源文件之间的关系。 2021-10-1134Makefile示例第

12、2章Linux下C语言开发工具 常用编辑工具常用编辑工具 GCC编译工具编译工具 Make工具与工具与Makefile文件文件 常用调试工具常用调试工具Linux库文件使用与创建库文件使用与创建 Autoconf/Automake自动化工具自动化工具 2021-10-1136GDB调试工具 完成如下的调试任务: (1)设置断点。 (2)监视程序变量的值。 (3)程序的单步执行。 (4)修改变量的值。2021-10-1137 GDB可用命令 2021-10-1138GDB示例 见教材。2021-10-1139strace strace用来跟踪一个进程的系统调用或信号产生的情况,而ltrace用来

13、跟踪进程调用库函数的情况。常用的三个命令行参数: -f:除了跟踪当前进程外,还跟踪其子进程。 -o file:将输出信息写到文件file中,而不是显示到标准错误输出(stderr)。 -p pid:绑定到一个由pid对应的正在运行的进程。此参数常用来调试后台进程。第2章Linux下C语言开发工具 常用编辑工具常用编辑工具 GCC编译工具编译工具 Make工具与工具与Makefile文件文件 常用调试工具常用调试工具Linux库文件使用与创建库文件使用与创建 Autoconf/Automake自动化工具自动化工具 2021-10-1141Linux库文件管理方式 静态库。在Linux中,以.a为

14、后缀,如libtest.a。应用程序从静态库中直接拷贝函数到二进制映像文件。 共享库,在Linux操作系统中,以libxxx.so.x.x为格式命名。可执行文件在运行时将函数代码从共享库文件中读出,从而间接引用。2021-10-1142库函数基本路径 /lib:系统必备共享库 /usr/lib:标准共享库和静态库 /usr/local/lib:本地函数库 2021-10-1143库文件搜索顺序 (1)首先在“LD_LIBRARY_PATH”环境变量所设置的路径下查找(一般都没有给此环境变量赋值); (2)搜索动态装载器在/etc目录下的缓存文件/etc/ld.so.cache(此文件由命令ld

15、config创建更新)。(在Redhat 9中,直接由/etc/ld.so.conf文件配置)。 因此,如果要使用自己创建的共享库文件(静态库直接在编译时指定即可),则需要将共享库拷贝到想要搜索路径下或者指定该库的具体路径。2021-10-1144ldd命令 -查看到某可执行程序库清单 2021-10-1145创建静态库 源文件信息。其中,“libhello.c”为要构建的库文件源文件,“libhello.h”为调用此库文件的头文件,“usehello.c”为测试程序。 生成目标文件 使用ar命令创建静态库 2021-10-1146使用静态库 头文件 和库文件信息2021-10-1147使用此

16、库文件 应用示例 编译 运行2021-10-1148共享库创建 2021-10-1149共享库创建示例 查看源文件,“libhello.c”为要构建的库文件源文件,“libhello.h”为调用此库文件的头文件,“usehello.c”为测试程序。 2021-10-1150构建共享库目标文件 2021-10-1151编译共享库并创建连接 2021-10-1152使用共享库 准备文件 头文件libhello.h:以知道有哪些函数,完成怎么样的功能,返回值以及参数情况。 库文件libhello.so.1.0及其链接libhello.so:库函数的二进制代码位置 2021-10-1153文件内容20

17、21-10-1154编译连接 2021-10-1155运行 如果希望在使用连接器时不使用-Ldirectory标识就可以查找到该库,则可以采用以下方式之一: 把此库拷贝到/usr/lib或者/lib文件夹中,或者在此两个文件夹任意一个中创建一个到该库的快捷方式,并命名为libname.so。 如果库所在路径没有在/usr/lib和/lib文件夹下,需要将该路径添加到文件“/etc/ld.so.conf”中,每一行增加一个路径,完成以上设置后,然后运行ldconfig命令更新库信息。第2章Linux下C语言开发工具 常用编辑工具常用编辑工具 GCC编译工具编译工具 Make工具与工具与Makef

18、ile文件文件 常用调试工具常用调试工具Linux库文件使用与创建库文件使用与创建 Autoconf/Automake自动化工具自动化工具 2021-10-1157自动创建Makefile文件流程 2021-10-1158示例 见教材。第3章Linux进程存储管理 Linux程序存储结构与进程结构程序存储结构与进程结构 ANSI C内存管理内存管理API函数函数 常用常用Linux内存管理及调试工具内存管理及调试工具 Linux进程环境及系统限制进程环境及系统限制 2021-10-1160二进制可执行文件 2021-10-1161可执行文件与进程存储布局 2021-10-1162各段说明(1)

19、代码区(text segment)。加载的是可执行文件代码段,其加载到内存中的位置由加载器完成。(2)全局初始化数据区/静态数据区(Data Segment)。加载的是可执行文件数据段,存储于数据段(全局初始化,静态初始化数据)的数据的生存周期为整个程序运行过程。(3)未初始化数据区(BSS)。加载的是可执行文件BSS段,位置可以分开亦可以紧靠数据段,存储于数据段的数据(全局未初始化,静态未初始化数据)的生存周期为整个程序运行过程。(4)栈区(stack)。由编译器自动分配释放,存放函数的参数值、返回值、局部变量等。在程序运行过程中实时加载和释放,因此,局部变量的生存周期为申请到释放该段栈空间

20、。(5)堆区(heap)。用于动态内存分配。堆在内存中位于BSS区和栈区之间。一般由程序员分配和释放,若程序员不释放,程序结束时有可能由OS回收。2021-10-1163C各存储类型比较 2021-10-1164栈和堆的区别 (1)管理方式不同。 (2)空间大小不同。 (3)产生碎片不同。 (4)增长方向不同。 (5)分配方式不同。 (6)分配效率不同。2021-10-1165数据存储位置 2021-10-1166常见内存错误 2021-10-1167临时空间过大 2021-10-1168申请堆空间后未释放 第3章Linux进程存储管理 Linux程序存储结构与进程结构程序存储结构与进程结构

21、ANSI C内存管理内存管理API函数函数 常用常用Linux内存管理及调试工具内存管理及调试工具 Linux进程环境及系统限制进程环境及系统限制 2021-10-1170malloc/free函数 2021-10-1171realloc更改已经配置的内存空间 第一个参数为试图更改大小的原堆空间位置,size为新的内存大小。如果内存减少,malloc仅仅改变索引信息,但并不代表被减少的部分还可以访问,这一部分内存将交给系统内存分配子程序。当需要扩大一块内存空间时,其返回情况如下: 如果当前内存段后面拥有需要的内存空间,则直接扩展这段内存空间,realloc()将返回原指针; 如果当前内存段后面

22、的空闲字节不够,那么就使用堆中第一个能够满足这一要求的内存块,将目前的数据复制到新的位置,并将原来的数据块释放掉,返回新的内存块位置。如果申请失败,将返回NULL,此时原来指针仍然有效。2021-10-1172内存数据管理函数 第3章Linux进程存储管理 Linux程序存储结构与进程结构程序存储结构与进程结构 ANSI C内存管理内存管理API函数函数 常用常用Linux内存管理及调试工具内存管理及调试工具 Linux进程环境及系统限制进程环境及系统限制 2021-10-1174常用工具 mcheck函数 Valgrind内存检测工具第3章Linux进程存储管理 Linux程序存储结构与进程

23、结构程序存储结构与进程结构 ANSI C内存管理内存管理API函数函数 常用常用Linux内存管理及调试工具内存管理及调试工具 Linux进程环境及系统限制进程环境及系统限制 2021-10-1176命令行参数管理 2021-10-1177getopt获取命令行参数 2021-10-1178环境变量 2021-10-1179Linux系统限制 2021-10-1180Linux系统限制2021-10-1181获取/修改系统限制 2021-10-1182Linux时间管理 UTC时间和Local Time时间的区别: UTC(Universal Time Coordinated)即GMT(Gre

24、enwich Mean Time)。 Local time为本地时间。 系统默认的时区配置文件位置为/etc/sysconfig/clock:rootlocalhost # cat /etc/sysconfig/clock ZONE=Asia/ChongqingUTC=trueARC=false 2021-10-1183时间管理函数2021-10-1184localtime 第4章ANSI C文件管理 文件及文件流文件及文件流 ANSI C标准文件标准文件I/O操作操作 格式化格式化输入输入/输出函数操作输出函数操作 2021-10-1186库函数调用和系统调用示意图 2021-10-1187

25、标准流 2021-10-1188输入输出示意图 2021-10-1189缓冲区主要功能 2021-10-1190文件流指针 2021-10-1191缓冲区类型 全缓冲区:这种缓冲区默认大小为8192。在缓冲区满或者显示调用刷新函数后才进行I/O系统调用操作。 行缓冲区。默认行缓冲区大小为128字节。当在遇到换行符或者缓冲区满时,标准I/O库将执行I/O系统调用操作。终端即行缓冲区。 不带缓冲区。标准I/O库不对字符进行缓存。 2021-10-1192指定流缓冲区 2021-10-1193修改buf大小写文件的实例程序 见教材。第4章ANSI C文件管理 文件及文件流文件及文件流 ANSI C标

26、准文件标准文件I/O操作操作 格式化格式化输入输入/输出函数操作输出函数操作 2021-10-1195打开关闭文件 2021-10-1196字符读文件流 2021-10-1197字符写操作 2021-10-1198行读写操作 2021-10-1199块读写文件流 2021-10-11100文件流检测 2021-10-11101文件流定位 2021-10-11102实现文件拷贝操作示例 见教材。第4章ANSI C文件管理 文件及文件流文件及文件流 ANSI C标准文件标准文件I/O操作操作 格式化格式化输入输入/输出函数操作输出函数操作 2021-10-11104printf/scanf函数 2

27、021-10-11105fprintf/fscanf函数 2021-10-11106sprintf函数2021-10-11107sprintf函数2021-10-11108sscanf函数 2021-10-11109sscanf函数第5章POSIX文件及目录管理 文件描述符与内核文件表项文件描述符与内核文件表项 POSIX标准下文件标准下文件IO管理管理 目录文件基本操作目录文件基本操作 2021-10-11111文件表结构图 2021-10-11112标准设备的文件描述符 2021-10-11113文件描述符与文件流的转换 第5章POSIX文件及目录管理 文件描述符与内核文件表项文件描述符与

28、内核文件表项 POSIX标准下文件标准下文件IO管理管理 目录文件基本操作目录文件基本操作 2021-10-11115打开文件2021-10-11116open函数的flags Flags说明O_RDONLY只读方式打开文件O_WRONLY只写方式打开文件O_RDWR可读可写方式打开文件O_CREAT若欲打开的文件不存在则自动建立该文件O_EXCL如果O_CREAT也设置,此指令会检查文件是否存在。若不存在则建立此文件,否则将导致打开文件错误,此外,若O_CREAT与O_EXCL同时设置,且欲打开的文件为符号连接,则打开文件失败O_NOCTTY如果欲打开的文件为终端设备时,则不会将该终端机当成

29、进程控制终端机O_TRUNC若文件存在并且以可写的方式打开时,此标识令文件长度为0,而原来存在于该文件的资料将会丢失O_APPEND当读写文件时会从文件尾开始移动,也就是所写入的数据会以附加的方式加入到文件后面O_NONBLOCK以不可阻断方式打开,也就是无论有无数据读取或等待,都会立即返回进程之中O_NDELAY同O_NONBLOCKO_SYNC以同步方式打开文件2021-10-11117关闭/创建文件 2021-10-11118文件控制fcntl 2021-10-11119读/写文件内容 2021-10-11120使用POSIX IO实现文件拷贝 示例 见代码。2021-10-11121文

30、件定位 第5章POSIX文件及目录管理 文件描述符与内核文件表项文件描述符与内核文件表项 POSIX标准下文件标准下文件IO管理管理 目录文件基本操作目录文件基本操作 2021-10-11123打开/关闭目录文件 2021-10-11124读写目录内容 2021-10-11125示例2021-10-11126定位目录位置 2021-10-11127添加删除目录 2021-10-11128返回/修改当前工作路径操作 2021-10-11129示例 2021-10-11130习题(1)标准输入输出设备的文件描述符和文件流指针分别是什么?文件流指针与文件描述符有什么区别?(2)比较POSIX标准与A

31、NSI标准I/O操作的效率,两者在可移植上有哪些差异,两者之间的关系是什么?有什么区别?(3)编写代码比较ANSI标准和POSIX标准读写函数效率(使用时间函数)。(4)用open或creat创建已经存在的文件是否修改文件的访问权限?写代码测试。(5)如启用添加标志(O_APPEND)打开一文件以便读、写,能否用lseek在任一位置开始读?能否用lseek更新文件中任一部分的数据?请写一段程序以验证之。第6章普通文件、连接文件及目录文件属性管理 Linux文件系统管理文件系统管理 Linux系统下文件类型及属性系统下文件类型及属性 Linux文件属性管理文件属性管理 应用示例:实现应用示例:实

32、现ls -l基本操作基本操作 2021-10-11132VFS虚拟文件系统 2021-10-11133VFS主要对象 对 象说 明superblock对象表示一个具体的可封装的文件系统inode对象表示一个具体的文件dentry对象表示一个目录条目,或路径中的一个分量file对象表示一个与进程相关联的已打开的文件2021-10-11134ext2文件系统结构 (1)超级块:整个文件系统的第一块空间。包括整个文件系统的基本信息,如块大小、指向空间inode和数据块的指针等相关信息。(2)Inode块:文件系统索引。它是文件系统的最基本单元,是文件系统连接任何子目录、任何文件的桥梁。每个子目录和文

33、件只有唯一的一个Inode块。它包括了文件系统中文件基本属性、存放数据的位置等相关信息。(3)数据块:具体存放数据的位置区域。为了提高目录访问的效率,Linux还维护了表达路径与Inode对应关系的dentry结构。它描述了路径信息并连接到节点Inode,它包括各种目录信息,还指向了Inode和超级块。就像一本书一样,有封面,目录和内容。在文件系统中,超级块就相当于封面,从封面可以得知这本书的基本信息;Inode块相当于目录,从目录可以得知各章节内容的位置;而数据块相当于书中的页面,记录着具体内容。2021-10-11135目录及常规文件存储概念图 2021-10-11136inode数据结构

34、 第6章普通文件、连接文件及目录文件属性管理 Linux文件系统管理文件系统管理 Linux系统下文件类型及属性系统下文件类型及属性 Linux文件属性管理文件属性管理 应用示例:实现应用示例:实现ls -l基本操作基本操作 2021-10-11138Linux文件类型及权限 2021-10-11139Linux文件类型 2021-10-11140文件类型宏操作 2021-10-11141测试某个打开的文件描述符 2021-10-11142文件权限修饰位 setuid和setgid位能让普通用户以root用户的角色运行只有root帐号才能运行的程序或命令。例如普通用户运行passwd命令来更改

35、自己的口令,实际上最终更改的是/etc/passwd文件。但是,/etc/passwd文件是用户信息的配置文件,只有root权限的用户才能更改内容。2021-10-11143文件访问权限位 第6章普通文件、连接文件及目录文件属性管理 Linux文件系统管理文件系统管理 Linux系统下文件类型及属性系统下文件类型及属性 Linux文件属性管理文件属性管理 应用示例:实现应用示例:实现ls -l基本操作基本操作 2021-10-11145读取文件属性 2021-10-11146struct stat 2021-10-11147读取文件属性代码 见教材代码。2021-10-11148修改文件权限操

36、作 2021-10-11149修改系统umask值 创建一个普通文件时的默认权限为0666-umask,如果创建一个目录,默认权限为0777-umask。在shell应用中,可以按如下方式使用umask命令:2021-10-11150修改文件的拥有者及组 2021-10-11151用户名与UID的转换 2021-10-11152struct passwd2021-10-11153示例程序 2021-10-11154组名与GID的转换2021-10-11155创建/删除硬连接 2021-10-11156符号连接文件特殊操作 2021-10-11157文件时间属性修改 第6章普通文件、连接文件及目

37、录文件属性管理 Linux文件系统管理文件系统管理 Linux系统下文件类型及属性系统下文件类型及属性 Linux文件属性管理文件属性管理 应用示例:实现应用示例:实现ls -l基本操作基本操作 2021-10-11159需求及知识点涵盖 2021-10-11160知识点本例实现该命令基本功能(主要为巩固本书第4、5、6章知识点),并固定argv1个参数为“-l”(实际应用中,“-l”的位置是可变的),根据argv2及后面参数情况列出相应的信息。显然,从需要来看,本示例程序主要涉及以下知识点: 参数检查。包括参数个数检查(2个或2个以上)。并判断第2个及以后的参数是否存在、是文件还是目录(这需

38、要使用stat函数读取该参数的属性)。 如果是普通文件。需要使用stat()函数读取文件的属性,并根据stat输出结果进行用户ID到用户名的转化,组ID到组名的转换,时间的转化(stat()函数输出的时间是自1970-1-1以来经历的秒数)。 如果是目录文件。需要依次读取该目录下的文件列表(如果有必要,还需要进行文件名排序),然后读取该文件基本信息。 如果是链接文件,还需要列出链接文件的源文件。本示例没有考虑设备文件的设备号等。2021-10-11161习题(1)Linux文件类型,在shell应用层面用ls -l查看命令不同类型的文件分别显示什么内容?(2)在Linux某个文件系统下,文件属

39、性中惟一标识某个文件的是什么?惟一标识一个打开的文件是什么?(3)ls lc,-lu,-lt分别列出的是什么时间?(4)Linux下文件属性有哪些,struct stat的各成员变量各代表什么意义?(5)一个文件设置了setuid、setgid位,该可执行文件在执行时有什么主要的影响。(7)一个常规文件的大小可以为0(st_size字段定义),那么目录和符号连接的长度是否可以为0?(6)编程实现文件夹的拷贝操作。*2021-10-11162代码 见教材分析。第7章进程环境及进程属性 进程环境及进程属性进程环境及进程属性 进程管理及控制进程管理及控制 Linux特殊进程特殊进程 2021-10-

40、11164进程资源 2021-10-11165进程状态 2021-10-11166进程基本属性 -进程号(PID) 2021-10-11167父进程号(PPID) 2021-10-11168进程组号(PGID) 进程组是一个或多个进程的集合。它们与同一作业相关联,可以接受来自同一终端的各种信号(关于信号的概念参阅第8章)。每个进程组都有唯一的进程组号,进程组号是可以在用户层修改的。 2021-10-11169会话 会话(session)是一个或多个进程组的集合。系统调用函数getsid()用来获取某个进程的会话号SID。如果调用此函数的进程不是一个进程组的组长,则此函数会创建一个新会话: 该进

41、程变成新会话首进程(session leader),会话首进程是创建该会话的进程。 该进程成为一个新进程组的组长进程。新进程组PGID是该调用进程的PID。 该进程没有控制终端。如果在调用setsid之前该进程就有一个控制终端,那么这种联系也会被中断。 2021-10-11170控制终端 会话和进程组有以下一些特点: (1)一个会话可以有一个控制终端,建立与控制终端连接的会话首进程被称为控制进程。 (2)一个会话中的几个进程组可被分成一个前台进程组和几个后台进程组,如果一个会话有一个控制终端,则它有一个前台进程组。 (3)无论何时键入终端的中断键(DELETE或Ctrl+C),就会将中断信号发

42、送给前台进程组的所有进程,无论何时键入终端的退出键(Ctrl+),就会将退出信号发送给前台进程组的所有进程,如果终端检测到调制解调器(或网络)已经断开连接,则将挂断信号发送给控制进程(会话首进程)。2021-10-11171终端处理函数2021-10-11172进程用户属性 进程真实用户号(RUID) 真实用户组号(RGID) 有效用户号(EUID) 有效用户组号(EGID) 2021-10-11173进程真实用户号(RUID) 2021-10-11174进程有效用户号(EUID) EUID主要用于权限检查。多数情况下,EUID和UID相同。如果可执行文件的setuid位有效,在除该文件的拥有

43、者之外的用户运行该程序时,EUID和UID则不相同。即当某可执行文件设置了setgid位(见文件属性章节介绍)后,任何用户(包括root用户)运行此程序时,其有效用户组EUID为该文件的拥有者。 2021-10-11175普通用户能够修改自己的密码的原因 /etc/passwd文件用来存储所有用户信息,任何用户都可以修改自己的密码,显然,其它用户在执行/usr/bin/passwd命令时修改了/etc/passwd文件(并不是说可以使用vi编辑器修改),但是,通过查看/etc/passwd文件的权限,发现普通用户对此文件仅有读的权限。是什么原因导致普通用户可以修改/etc/passwd文件呢?

44、这是因为用户执行“/usr/bin/passwd”命令时,/usr/bin/passwd文件设置了setuid位,在执行此程序(/usr/bin/passwd)时,该用户所拥有的权限等同于文件“/usr/bin/passwd”的拥有者root的权限,而root用户拥有对/ect/passwd文件写的权限,因此普通用户可以通过/usr/bin/passwd来修改/etc/passwd文件的内容。如果清除掉“/usr/bin/passwd”文件的setuid权限位,普通用户就不能修改自己的密码了。 2021-10-11176进程用户组号(GID) 创建进程的用户所在的组号为该进程的进程用户组号(G

45、ID)。可以通过调用getgid()函数来获得当前进程的真实用户组号(GID)。 2021-10-11177有效进程用户组号(EGID) 第7章进程环境及进程属性 进程环境及进程属性进程环境及进程属性 进程管理及控制进程管理及控制 Linux特殊进程特殊进程 2021-10-11179创建进程 fork函数调用成功后,其子进程会复制父进程的几乎所有信息(除PID等信息),主要复制父亲进程的代码段、数据段、BSS、堆、栈(关于进程结构参阅本书第3章)、打开的文件描述符(但共用同一个文件表项)。 另外,子进程从父进程继承下列属性:实际用户/组号、有效用户/组号以及保留的用户/组号、进程组号、环境变

46、量、对文件的执行时关闭标志、信号处理方式设置、信号掩码、当前工作目录、根目录、文件模式创建掩码、文件大小限制等信息。2021-10-11180示例2021-10-11181对打开文件的处理 2021-10-11182fork是否在子进程复制验证代码 验证数据段(使用全局、静态初始化变量),BSS段(未初始化全局,静态变量),栈(局部变量),堆(malloc返回空间)。 代码见教材。2021-10-11183vfork /* Clone the calling process, but without copying the whole address space. The calling pr

47、ocess is suspended until the new process exits or is replaced by a call to execve. Return -1 for errors, 0 to the new process, and the process ID of the new process to the old process. */ extern _pid_t vfork (void) ; #endif 2021-10-11184Vfork与fork比较验证代码 见教材代码。2021-10-11185execX函数执行新代码2021-10-11186ex

48、ecX函数比较函数使用文件名使用路径名使用参数表(函数出现字母l)使用argv(函数出现字母v) execl execlp execle execvexecvp execve2021-10-11187执行新代码对打开文件的处理 在执行exec系列函数时,默认情况下,新代码对于可以使用在原来代码中打开的文件描述符,即执行exec系列函数时,并不关闭原来的文件描述符。 但如果调用fcntl函数 即关闭FD_CLOEXEC项,则在执行execX系列函数后将关闭原来打开的文件描述符。 2021-10-11188等待进程结束 调用wait()函数的父亲进程将等待该进程的任意一个子进程结束后才继续执行(如

49、果有多个子进程,只需要等待其中的一个进程)。 2021-10-11189waitpid2021-10-11190退出进程 可以通过以下方式结束进程。 向exit或_exit发布一个调用。 在main函数中执行return。 隐含的离开main函数。2021-10-11191函数说明2021-10-11192示例代码2021-10-11193exit 与_exit2021-10-11194exit与return的区别 C语言关键字return与函数exit()在main函数退出时有相似之处,但两者有本质的区别: return 退出当前函数主体,exit()函数退出当前进程,因此,在main函数里

50、面return(0)和exit(0)完成一样的功能。 return仅仅从子函数中返回,而子进程用exit()退出,调用exit()时要调用一段终止处理程序,然后关闭所有I/O流。2021-10-11195示例代码2021-10-11196修改进程用户相关信息 access核实用户权限 2021-10-11197设置进程真实用户RUID 2021-10-11198设置进程有效用户EUID 第7章进程环境及进程属性 进程环境及进程属性进程环境及进程属性 进程管理及控制进程管理及控制 Linux特殊进程特殊进程 2021-10-11200守候进程 守护进程(Daemon)是运行在后台的一种特殊进程,

51、其脱离于终端,之所以脱离于终端是为了避免进程被任何终端所产生的信息所打断,其在执行过程中的信息也不在任何终端上显示。守候进程周期性地执行某种任务或等待处理某些发生的事件,Linux的大多数服务器就是用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd等。 一般情况下,守护进程可以通过以下方式启动: 在系统启动时由启动脚本启动,这些启动脚本通常放在/etc/rc.d目录下; 利用inetd超级服务器启动,如telnet等; 由cron定时启动以及在终端用nohup启动的进程也是守护进程。2021-10-11201守护进程编程要点 2021-10-11202守护进程编程

52、要点2021-10-11203守护进程编程要点2021-10-11204日志信息及其管理 2021-10-11205建立与日志守候进程联系 2021-10-11206openlog() 2021-10-11207写日志信息 2021-10-11208守候进程应用示例 见教材代码。2021-10-11209孤儿进程与僵死进程 因父亲进程先退出而导致一个子进程被init进程收养的进程为孤儿进程。 而已经退出但还没有回收资源的进程为僵死进程。 示例代码见教材。第8章进程间通信管道和信号 进程间通信进程间通信PIPE 进程间通信进程间通信FIFO 信号中断处理信号中断处理 2021-10-11211管

53、道示例 2021-10-11212创建无名管道 2021-10-11213文件描述符重定向 (1)cattest02test02 2error test02 1&2 test02test012021-10-11214dup() / dup2() 2021-10-11215复制文件描述符 2021-10-11216实现who|sort 即使用无名管道将执行who命令的进程与执行sort命令的进程联系在一起,将当前系统用户信息按排序方法输出。 过程及示例代码见教材。2021-10-11217流重定向 第8章进程间通信管道和信号 进程间通信进程间通信PIPE 进程间通信进程间通信FIFO 信号中断处

54、理信号中断处理 2021-10-11219FIFO应用示例2021-10-11220管道示例2021-10-11221创建FIFO2021-10-11222应用示例 亲缘关系进程使用有名管道通信应用实例 见教材。 非亲缘关系进程使用有名管道通信应用实例 见教材。2021-10-11223管道基本特点总结 两类型管道具有以下特点:(1)管道是特殊类型的文件,在满足先入先出的原则条件下可以进行读写,但不能定位读写位置。(2)管道是单向的,要实现双向,需要两个管道。无名管道只能实现亲缘关系进程间通信(即无名管道的两个文件描述符可以被两者都访问到),而有名管道以磁盘文件的方式存在,可以实现本机任意两进

55、程间通信。(3)无名管道阻塞问题。无名管道无须显式打开,创建时直接返回文件描述符,而在读写时需要确实对方的存在,否则将退出。即如果当前进程向无名管道的写数据时,必须确定其别一端为某个进程(这个进程可以是当前进程)拥有,即有一个(或多个)进程的文件描述符表中至少有一个成员指向管道的另一端(显然,能够读写管道当前端,则本端在当前进程中是可以访问的)。如果写入无名管道的数据超过其最大值,写操作将阻塞,如果管道中没有数据,读操作将阻塞,如果管道发现另一端断开(另一端文件描述符关闭),将自动退出。(4)有名管道阻塞问题。有名管道在打开时需要确实对方的存在,否则将阻塞。即以读方式打开某管道,该操作得以继续

56、执行的条件是:在此之前,已经有一个进程以写的方式打开此管道,否则阻塞,直到条件满足,因此有名管道将阻塞在打开位置。也可以以读写(ORDWR)方式打开有名管道,进程能够继续执行(不阻塞),只是这样操作没有什么意思,即当前进程读,当前进程写。第8章进程间通信管道和信号 进程间通信进程间通信PIPE 进程间通信进程间通信FIFO 信号中断处理信号中断处理 2021-10-11225Linux常见信号与处理 2021-10-11226信号的处理流程 (1)信号被某个进程产生,并设置此信号传递的对象(一般为对应进程的pid),然后传递给操作系统; (2)操作系统根据接收进程的设置(是否阻塞)而选择性的发

57、送给接收者,如果接收者阻塞该信号(且该信号是可以阻塞的),操作系统将暂时保留该信号,而不传递,直到该进程解除对此信号的阻塞(如果对应进程已经退出,则丢弃此信号);如果对应进程没有阻塞,操作系统将传递此信号; (3)目的进程接收到此信号后,将根据当前进程对此信号设置的预处理方式,暂时终止当前代码的执行,保护上下文(主要包括临时寄存器数据、当前程序位置以及当前CPU的状态)、转而执行中断服务程序,执行完成后再恢复到被中断的位置。当然,对于可抢占式内核,在中断返回时还将引发新的调度。 2021-10-11227可能的信号来源 2021-10-11228kill产生一个信号 2021-10-11229

58、raise自举一个信号 2021-10-11230alarm()定时 2021-10-11231ualarm定时 2021-10-11232信号处理与signal安装信号 信号处理办法 (1)忽略此信号。大多数信号都可使用这种方式进行处理,但有两种信号不能被忽略,SIGKILL和SIGSTOP。这两种信号不能被忽略的原因是:它们向超级用户提供一种使进程终止或停止的可靠方法。 (2)捕捉信号。通知内核在某种信号发生时调用一个用户函数。在用户函数中,可执行用户希望对这种事件进行的处理,这需要安装此信号。例如捕捉到SIGCHLD信号,则表示子进程已经终止,所以此信号的捕捉函数可以调用waitpid(

59、)以取得该子进程的进程PID以及它的终止状态和资源。 (3)执行系统默认操作。Linux系统对任何一个信号都规定了一个默认的操作。 2021-10-11233signal安装信号 2021-10-11234sigaction安装信号 2021-10-11235struct sigaction 2021-10-11236信号集与屏蔽信号 中断是可以被屏蔽(阻塞)的(部分硬件中断是必须立即处理的,例如复位中断),因此,Linux的信号是可以屏蔽,即阻塞信号。但这与前面提到的忽略是有区别的。 信号忽略:系统仍然传递该信号,只是相应进程对该信号不作任何处理而已。 信号阻塞:系统不传递该信号,显示该进程

60、无法接收到该信号直到进程屏蔽的信号集发生改变。2021-10-11237sigprocmask设置进程阻塞的信号集 2021-10-11238等待信号 2021-10-11239信号应用示例 -基本功能 创建了两个进程: 父亲进程执行文件拷贝操作(为验证此程序,请选择大小在M级以上文件),如果接收到SIGUSR1信号,将打印出当前的拷贝进度,因此,父亲进程需要安装SIGUSR1信号; 子进程每隔一个固定时间(其时间由ularm函数产生SIGALRM信号来决定)向父亲进程发送SIGUSR1信号。因此,子进程需要安装SIGALRM信号。 代码见教材。第9章System V进程间通信 System

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论