1、Linux编程基础编程基础北京交通大学 电子信息工程学院 22022-6-7应用编程基础应用编程基础n应用程序编译应用程序编译n文件操作n进程操作n进程间通信 北京交通大学 电子信息工程学院 32022-6-7应用程序的编译应用程序的编译nGNU工具链 GNU是“GNUs Not Unix”的递归缩写 Richard Stallman创立自由软件基金会(Free Software Foundation)支持GNU计划 GNU软件遵守协议: GPL:GNU通用公共许可证(GNU General Public License) LGPL:GNU较宽松公共许可证 (GNU Lesser Genera
2、l Public License) GFDL : GNU自由文档许可证(GNU Free Documentation License ) GCC(GNU Compiler Collection,GNU编译器集合) GNU工具与Linux的结合: GNU/Linux http:/www.gnu.org/北京交通大学 电子信息工程学院 42022-6-7应用程序的编译应用程序的编译nGNU工具链组成 Binutils: 一组用于编译、链接、汇编和其他调试目的的程序,包括ar, as, ld, nm, objcopy, objdump, ranlib, readelf, size, strings,
3、 strip等。 gcc : gnu的编译器集合,Linux环境使用的C语言编译器 glibc: gnu的C语言标准函数库。该库实现Linux系统函数,例如open、read等,也实现标准C语言库,如printf等。几乎所有应用程序都需要与glibc链接。北京交通大学 电子信息工程学院 52022-6-7应用程序的编译应用程序的编译nGCC 集成了多种编译器的编译程序 支持C, C+, Fortran, Java等语言 可执行文件名字gcc,也可以使用单一语言的编译器 命令行启动命令行启动 gcc hello.c 完成编译和连接生成a.out可执行程序,执行此程序 ./a.out北京交通大学
4、电子信息工程学院 62022-6-7应用程序的编译应用程序的编译nGCC编译选项编译选项 从C语言源程序生成可执行代码文件的过程 预处理 编译(生成汇编代码) 汇编 连接 GCC用文件名后缀判断编译类型,也可用-x选项强迫GCC从哪个阶段开始 用-c, -S, -E选项让编译到某一步结束 -c:编译或汇编源文件,不连接,输出.o文件 -S:编译后停止,不进行汇编,生成汇编代码.s文件 -E:预处理后停止,不编译,预处理后送到stdout 用用-o file指定输出文件名,哪一个阶段都有效指定输出文件名,哪一个阶段都有效。 例如:gcc hello.c o hello北京交通大学 电子信息工程学
5、院 72022-6-7应用程序的编译应用程序的编译nGCC文件类型约定文件类型约定* file.c : 必须处理的C源文件 file.i : 不应被预处理的C源文件 file.ii:不应被预处理的C+源文件 file.h: C头文件(不被编译和连接) file.cc,file.cp, file.cpp,file.cxx, file.c : 必须预处理的C+源文件 file.s: 汇编源程序 file.S : 必须预处理的汇编程序 其他:其他扩展名的文件都被作为连接时使用的目标文件北京交通大学 电子信息工程学院 82022-6-7应用程序的编译应用程序的编译nGNU make工具和工具和Make
6、file 命令行调用gcc只能处理简单的源文件较少的程序,复杂的软件项目包含大量源程序和头文件,需要借助make工具来自动编译。 GNU make工具: 自动化管理工具,管理软件编译的内容、方式和时机 自动处理源文件模块之间的包含和引用关系 方便将软件项目的代码分开放在多个源文件中,只对更新的代码进行编译,提高工作效率。 文件Makefile用来告诉make工具如何根据依赖的源文件产生目标代码 make工具也可以用来进行一般的文件处理,从多个输入文件来产生输出文件。北京交通大学 电子信息工程学院 92022-6-7应用程序的编译应用程序的编译n代码的代码的Build过程过程 Build工具的目
7、标: 使用build命令从输入文件(依赖文件)产生可执行文件(目标) 可以同时产生多个目标(例如ARM,X86,DSP) 方法:命令行,脚本工具makeBuild工具工具Build 指令指令源文件源文件“ Dependencies”app.capp.cfgapp.happ.x64Papp.xv5Tapp.x470MVapp.x86U可执行文件可执行文件 “ Targets”app.oapp.lib“ D”“ CMD”“ T”北京交通大学 电子信息工程学院 102022-6-7应用程序的编译应用程序的编译n基于命令行的基于命令行的build 从输入文件从输入文件app.c产生一个目标文件产生一个
8、目标文件app.o gcc g c app.c o app.o从目标代码从目标代码app.o产生一个可执行文件产生一个可执行文件 (app.x86U) gcc g app.o o app.x86U命令commandflagdependencyflagtargetCommand Line依赖文件app.capp.oapp.oapp.x86U目标“D”“CMD”“T”-c = compile only-g = build with debug enabled-o = output filename北京交通大学 电子信息工程学院 112022-6-7应用程序的编译应用程序的编译n利用利用Makefi
9、le的基本规则的基本规则 make依赖文件app.capp.oapp.oapp.x86U目标“D”“CMD”“T”多种脚本工具可用,例如GNU make, 即gMakeMake利用规则来指定构建命令,依赖文件文件和构建目标Make规则的一般形式MakefileTARGET : DEPENDENCYTAB COMMANDS北京交通大学 电子信息工程学院 122022-6-7应用程序的编译应用程序的编译n利用利用Makefile的基本规则的基本规则 TARGET : DEPENDENCYTAB COMMANDS命令行 变为简单的Makefile规则app.x86U : app.o gcc g ap
10、p.o o app.x86U规则规则 gcc g app.o o app.x86Ucommandflagdependencyflagtarget当目标目标app.x86U依赖依赖的app.o比较它自己更新时,执行其后的命令命令gcc。北京交通大学 电子信息工程学院 132022-6-7应用程序的编译应用程序的编译n简单的简单的Makefile* make依赖文件app.capp.oapp.oapp.x86U目标“D”“CMD”“T”Makefile gcc c g app.c o app.o gcc g app.o o app.x86U 命令行# Makefile for app.x86U (
11、目标目标)app.x86U : app.ogcc g app.o o app.x86Uapp.o : app.cgcc g c app.c o app.o Makefile北京交通大学 电子信息工程学院 142022-6-7应用程序的编译应用程序的编译n用户定义变量和包含文件用户定义变量和包含文件 用户定义变量简化Makefile增加可读性 包含文件可以指定路径等include path.makCC := $(CC_DIR)gccCFLAGS := -gLINK_FLAGS := -oapp.x86U : app.o $(CC) $(CFLAGS) $ $(LINK_FLAGS) $ CC_D
12、IR := /usr/bin/.# other paths go hereMakefilepath.mak变量定义、赋值$变量名 :引用自定义变量引用内建变量北京交通大学 电子信息工程学院 152022-6-7应用程序的编译应用程序的编译n使用内建变量使用内建变量 使用make的内建变量简化Makefile增加可读性 $ = 目标名 $ = 所有依赖文件 $010000000000., 832) = 832. . .北京交通大学 电子信息工程学院 232022-6-7文件操作文件操作n访问文件的两级接口访问文件的两级接口 低级函数低级函数(基于文件描述符)用来访问设备驱动和系统调用,主要包括
13、open: 打开文件和设备 read: 读打开的文件/设备 write: 写文件或设备 close: 关闭文件/设备 ioctl: 向设备驱动传递控制信息 低级函数对应一个系统调用 高级接口由标准库函数提供。 例如头文件stdio.h中定义的函数属于标准标准 I/O函数函数库,这些函数可以提供输出缓冲。北京交通大学 电子信息工程学院 242022-6-7文件操作文件操作n文件描述符文件描述符 每个运行的程序称为一个进程,拥有若干与之关联的文件描述符。 文件描述符是非负整数,用来访问文件或设备。 当一个进程请求打开或建立一个文件时,Linux内核会返回一个与该进程关联的文件描述符。 当一个程序启
14、动时,系统通常会给它打开了3个文件描述符: 0:标准输入 STDIN_FILENO 1:标准输出 STDOUT_FILENO 2:标准错误输出 STDERR_FILENO北京交通大学 电子信息工程学院 252022-6-7文件操作文件操作n低级文件访问低级文件访问 :write write系统调用将缓冲区buf中的数据的前面nbytes字节写入文件描述符fildes指定的文件中,返回实际读取的字节数。#include size_t write(int fildes, const void *buf, size_t nbytes);/* simple_write.c */#include #in
15、clude int main() if (write(1, “Here is some datan”, 18) != 18) write(2, “A write error has occurred !n”,30); exit(0);$ ./simple_writeHere is some data$北京交通大学 电子信息工程学院 262022-6-7文件操作文件操作n低级文件访问低级文件访问 :read Read 从文件描述符指定的文件中读取最多nbytes字节,将它们放在数据缓冲区buf中,返回实际读取的字节数。#include size_t read(int fildes, void *
16、buf, size_t nbytes);#include int main() char buffer128; int nread; nread = read(0, buffer, 128); if (nread = -1) write(2, “A read error has occurredn”, 26); if (write(1,buffer,nread) != nread) write(2, “A write error has occurredn”,27);从标准输入读入最多128字节,然后写到标准输出.北京交通大学 电子信息工程学院 272022-6-7文件操作文件操作n低级文件访
17、问低级文件访问 :read Read 从文件描述符指定的文件中读取最多nbytes字节,将它们放在数据缓冲区buf中,返回实际读取的字节数。#include size_t read(int fildes, void *buf, size_t nbytes);#include #include int main() char buffer128; int nread; nread = read(0, buffer, 128); if (nread = -1) write(2, “A read error has occurredn”, 26); if (write(1,buffer,nread)
18、 != nread) write(2, “A write error has occurredn”,27);$ echo hello there | ./simple_readhello there$ ./simple_read draft1.txtIn this chapter we will be looking at files and directories and how to manipulate them. We will learn how to create files,$北京交通大学 电子信息工程学院 282022-6-7文件操作文件操作n低级文件访问低级文件访问 :ope
19、n open系统调用建立一个新的文件描述符,它建立一个访问一个文件或设备的通道。成功时返回一个文件描述符(非负整数),失败时返回-1。 文件描述符是唯一的,不会与其它进程共享。 参数path是要打开的文件或设备路径名; 参数oflags用来说明打开文件要完成的动作。它是一个必要的访问模式和其他可选模式的组合。 参数mode只有当动作是建立新文件时才需要。#include int open(const char *path, int oflags);int open(const char *path, int oflags, mode_t mode);北京交通大学 电子信息工程学院 292022
20、-6-7文件操作文件操作n低级文件访问低级文件访问 :open int open(const char *path, int oflags, mode_t mode);n基本文件访问模式基本文件访问模式Mode Mode DescriptionDescriptionO_RDONLY Open for read-onlyO_WRONLY Open for write-onlyO_RDWR Open for reading and writingn可选的文件访问模式可选的文件访问模式 Mode Mode DescriptionDescriptionO_APPEND: 把数据添加到文件尾部.O_TR
21、UNC: 设置文件长度为0, 丢弃已有的内容.O_CREAT: 若需要则按照指定的权限创建该文件.O_EXCL: 与 O_CREAT一起使用, 保证调用者建立文件。其中之一与可选模式进行 “|” 组合北京交通大学 电子信息工程学院 302022-6-7文件操作文件操作n建立文件时指定初始访问权限建立文件时指定初始访问权限 int open(const char *path, int oflags, mode_t mode);n以O_CREAT作为offlag标志调用 open建立新文件时,必须使用第三个参数mode,其取值是由sys/stat.h中定义的标志按位OR组合得到。Read perm
22、issionWrite permissionExecute permissionOwnerS_IRUSRS_IWUSRS_IXUSRGroupS_IRGRPS_IWGRPS_IXGRPOtherS_IROTHS_IWOTHS_IXOTHopen (“myfile”, O_CREAT, S_IRUSR|S_IXOTH);$ ls -ls myfile0 -r-x 1 neil software 0 Sep 22 08:11 myfile*Example:北京交通大学 电子信息工程学院 312022-6-7文件操作文件操作n低级文件访问低级文件访问 close 用 close中止文件描述符 fil
23、des与文件的关联,使得该文件描述符可以被重新使用。 成功关闭返回0,否则返回-1。#include int close(int fildes);北京交通大学 电子信息工程学院 322022-6-7文件操作文件操作n低级文件访问低级文件访问 ioctl ioctl用来对文件描述符fildes代表的对象实施某种控制功能,功能由参数cmd指定。 函数还可以带有更多参数,取决于特定设备支持的具体功能。 例如,让Linux打开键盘上的LED显示:#include int ioctl(int fildes, int cmd, .);ioctl(tty_fd, KDSETLED, LED_NUM|LED_
24、CAP|LED_SCR);北京交通大学 电子信息工程学院 332022-6-7文件操作文件操作n低级文件访问低级文件访问 lseek lseek用来设定读写文件的指针,确定对文件的下次读写操作的位置。 Offset参数给定相对于whence指定位置的偏移量。Whence参数可以为: 该调用成功时返回设定位置距离文件起始位置的字节偏移量,失败时返回-1。#include #include off_t lseek(int fildes, off_t offset, int whence); SEEK_SET: offset 为绝对位置 SEEK_CUR: offset 相对于当前位置 SEEK_E
25、ND: offset 相对于文件结尾北京交通大学 电子信息工程学院 342022-6-7文件操作文件操作n标准输入标准输入/输出的重新定向输出的重新定向* 打开文件得到的新文件描述符总是可用的最小数值,这在某些场合是非常有用的。 例如,重新定向标准输出到一个文件: #include #include int main() int fd; close(1); fd=open(Myfile, O_WRONLY); if(fd!=-1) printf(Add a line to Myfile.n); write(fd, “Output to a file !n”, 19); close(fd); 北
26、京交通大学 电子信息工程学院 352022-6-7文件操作文件操作n标准标准I/O函数库函数库 标准 I/O库 (stdio)及其头文件 stdio.h提供了灵活多样的函数来连接底层I/O系统调用。 此标准库现在是ANSI标准 C的一部分,提供复杂的输出格式和输入扫描格式,对某些设备提供缓冲服务提供缓冲服务。 需要打开一个文件建立访问通道。打开的文件用一个指向数据结构的指针指针FILE *来表示,作为其他IO函数的引用参数。 标准IO函数将文件内容看成是数据流。 当程序启动时系统自动打开3个流文件流文件,即 stdin, stdout, 和stderr,代表标准输入、标准输出和错误输出,分别对
27、应于底层文件描述符 0, 1 和 2。北京交通大学 电子信息工程学院 362022-6-7文件操作文件操作n标准标准I/O函数库函数库 在头文件 stdio.h定义的函数包括以下常用函数 相对于底层文件访问函数,高层函数我们更为熟悉,在此不多讨论。 fopen, fclose fread, fwrite fflush fseek fgetc, getc, getchar fputc, putc, putchar fgets, gets printf, fprintf, and sprintf scanf, fscanf, and sscanf北京交通大学 电子信息工程学院 372022-6-7
28、文件操作文件操作n标准标准I/O函数的类型函数的类型 标准I/O 提供三种类型的缓存 全缓冲:当填满I/O 缓存后才进行实际的I/O 操作; 行缓冲:当在输入和输出中遇到新换行符(n)时,进行I/O 操作; 不带缓冲:标准I/O 库不对字符进行缓冲,例如stderr; fopen函数返回一个FILE*指针,指向对应的数据流 打开文件分为文本文件和二进制文件 二进制文件可用fread和fwrite函数读写 文本文件可用字符读写函数操作 字符输入输出: fgetc()和fputc(),一次仅读写一个字符 行输入输出:gets(),puts(),fgets(),fputs(),一次操作一行 格式化输
29、入输出:可以指定输入输出的具体格式,printf、fprintf,sprintf,scanf,fscanf,sscanf,北京交通大学 电子信息工程学院 382022-6-7文件操作文件操作n标准标准I/O函数的缓冲效果函数的缓冲效果 例子:全缓冲(1024字节缓冲区)#include #include int main() int i=0; for(i=0;i260;i+) /每次向缓冲区内写4个字符 /*printf(%03dn,i);*/ fprintf(stdout,%03d ,i); /* fflush(stdout); */ /* sleep(1); */ while(1); /避
30、免程序结束,等待缓冲区填充。北京交通大学 电子信息工程学院 392022-6-7应用编程基础应用编程基础n应用程序编译n文件操作n进程操作进程操作n进程间通信北京交通大学 电子信息工程学院 402022-6-7进程操作进程操作nLinux进程进程 “Everything in Unix is a file. Everything in Unix is a file. Everything in Unix that is not a file is a process Everything in Unix that is not a file is a process” 进程 程序的一个运行实例
31、 一个程序可以同时有多个运行实例 与进程相关的数据: 打开的文件,分配的内存,进程ID,父进程ID,优先级,状态 进程相互独立,并发执行. 进程由操作系统调度。 Linux用task数据结构来管理进程,其中包含了描述进程的PID,PPID等数据。北京交通大学 电子信息工程学院 412022-6-7进程操作进程操作nLinux进程进程 进程封装了一个程序以及与其相关的所有资源。 每个进程程序有自己的进入点main()函数 每个进程有自己的虚拟内存空间,与其他进程内存空间隔离。例:显示当前所有的用户进程$ ps -ef例:显示当前终端上运行的进程% psPID TTY TIME CMD21693
32、pts/8 00:00:00 bash21694 pts/8 00:00:00 ps北京交通大学 电子信息工程学院 422022-6-7进程操作进程操作nLinux进程进程 显示进程自己ID和父进程ID#include #include int main ()printf (“The process ID is %dn”, (int) getpid ();printf (“The parent process ID is %dn”, (int) getppid ();return 0;北京交通大学 电子信息工程学院 432022-6-7进程操作进程操作n并行执行的进程并行执行的进程/ audi
33、o_video.cint main(int argc, char *argv)while(condition = TRUE)callAudioFxn();callVideoFxn();/ audio.c, handles audio onlyint main(int argc, char *argv) while(condition = TRUE)callAudioFxn();方法方法1:在一个进程中处理音频:在一个进程中处理音频和视频和视频/ video.c, handles video onlyint main(int argc, char *argv) while(condition =
34、 TRUE)callVideoFxn();方法方法2:在不同进程中分别处理:在不同进程中分别处理音频和视频音频和视频分开两个进程的好处:分开两个进程的好处: 1.不同的处理速率,不同的优先级 2.可能需要多个音频/视频通道(模块化)3.需要各自内存保护北京交通大学 电子信息工程学院 442022-6-7进程操作进程操作n在终端中观察进程在终端中观察进程nps ux 列出属于当前用户的所有进程nps aux 列出运行在系统上的所有进程nps -auxUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDbart 3039 0.0 0.2 59
35、16 1380 pts/2 S 14:35 0:00 /bin/bashbart 3134 0.0 0.2 5388 1380 pts/3 S 14:36 0:00 /bin/bashbart 3190 0.0 0.2 6368 1360 pts/4 S 14:37 0:00 /bin/bashbart 3416 0.0 0.0 0 0 pts/2 R 15:07 0:00 bash .PID: Process idVSZ: Virtual process size (code + data + stack)RSS: Process resident size: number of KB cu
36、rrently in RAMTTY: TerminalSTAT: Status: R (Runnable), S (Sleep), D (Uninterrupted sleep), Z (Zombie), T(Traced)北京交通大学 电子信息工程学院 452022-6-7进程操作进程操作n管理背景任务进程管理背景任务进程n启动任务在背景运行 ./sleep 30 &n显示同一个shell里面背景任务 jobs -l 1- sleep 30 &n把最后一个/ 第n个背景任务放到前台运行 fg fg %nn把当前任务放到背景去运行 Ctrl-Z bgn中止第n个任务 kill %n北京交通大学
37、 电子信息工程学院 462022-6-7进程操作进程操作n/proc虚拟文件系统虚拟文件系统 该目录下的虚拟文件给出系统和进程相关信息 /proc/version 操作系统版本 /proc/cpuinfo处理器信息 /proc/ 进程ID目录下为该进程信息 cmdline 命令行 cwd 当前目录 environ 环境变量 fd/ 子目录,打开的文件描述符 maps 映射到进程地址空间的文件,程序,库文件,ets exe 可执行映像的符号连接 . . .北京交通大学 电子信息工程学院 472022-6-7进程操作进程操作n在程序中建立新进程在程序中建立新进程n系统中所有进程都是从一个原始进程分
38、裂出来,这个原始进程是启动时建立的。n当使用fork系统调用时,两个进程执行相同的代码。n可以检测谁是新进程并让它执行另外一个程序(调用exec)将一个执行的将一个执行的进程分裂为进程分裂为两个相同的环境两个相同的环境新进程替代新进程替代老进程但维持老进程但维持以前的环境以前的环境启动新进程启动新进程同时同时保留老进程保留老进程forkexecfork + exec北京交通大学 电子信息工程学院 482022-6-7进程操作进程操作n在在C程序中复制进程程序中复制进程n调用系统调用函数fork建立一个新进程.nFork建立的子进程克隆了父进程的数据和环境n当从fork返回时,两个进程运行相同的
39、程序,程序如何知道处在哪一个进程中?n对于父进程,Fork会返回子进程的PID,对于子进程,fork返回0。#include #include pid_t fork(void);北京交通大学 电子信息工程学院 492022-6-7进程操作进程操作n在在C程序中复制进程程序中复制进程 Which is which ? pid_t new_pid; new_pid = fork(); switch(new_pid) case -1: /* Error */ break; case 0: /* Its child */ break; default: /*Its parent*/ break; 北京
40、交通大学 电子信息工程学院 502022-6-7进程操作进程操作n等待进程结束等待进程结束int main() pid_t pid; int status; pid = fork(); switch(pid) case -1: pprintf(fork failed); exit(1); case 0: printf(Im the child!n); exit(0); default: printf(Im the parent!n); wait(&status); if (WIFEXITED(status) printf(Child exist with status of %dn, WEXI
41、TSTATUS(status); exit(0);#include #include #include #include #include 北京交通大学 电子信息工程学院 512022-6-7进程操作进程操作n建立进程执行新程序建立进程执行新程序pid_t pid;if (pid = fork() int status; printf(Im the parent!n); wait(&status); else printf(Im the child!n); execve(“/bin/ls”, argv, envp);此调用将会用存储在指定路径中的程序替换内存中的程序映像(代码和数据)。先前打开
42、的文件描述符,优先级和其他属性保持不变。北京交通大学 电子信息工程学院 522022-6-7进程操作进程操作n执行新程序例子执行新程序例子#include #include #include #include int main () /* 传递给“ls”命令的参数列表*/ char* arg_list = ls, -l, /,NULL ; spawn (ls, arg_list); printf (done with main programn); return 0;北京交通大学 电子信息工程学院 532022-6-7进程操作进程操作n执行新程序例子执行新程序例子#include #inclu
43、de #include #include int main () /* 传递给“ls”命令的参数列表*/ char* arg_list = ls, -l, /,NULL ; spawn (ls, arg_list); printf (done with main programn); return 0;int spawn (char* program, char* arg_list) pid_t child_pid; /* 复制一个进程*/ child_pid = fork (); if (child_pid != 0)/* 这是父进程,返回. */ sleep(30);/*父进程结束前可观察
44、僵尸子进程*/ return child_pid; else /*子进程,执行程序 ls. */ execvp (program, arg_list); /*execvp函数只有出错时才返回 */ fprintf (stderr, An error occurredn); abort (); 北京交通大学 电子信息工程学院 542022-6-7进程操作进程操作nexec函数族函数族 用来替换当前进程执行的程序 不同的变种,启动进程和传递参数的方式有差别。 以p结尾的形式在环境变量PATH中搜索程序的位置 以e结尾的形式可传递自定义的环境变量#include char *environ;int
45、execl(const char *path, const char *arg0, ., (char *)0);int execlp(const char *file, const char *arg0, ., (char *)0);int execle(const char *path, const char *arg0, ., (char *)0, char *const envp);int execv(const char *path, char *const argv);int execvp(const char *file, char *const argv);int execve(
46、const char *path, char *const argv, char *const envp);北京交通大学 电子信息工程学院 552022-6-7进程操作进程操作nexec函数族函数族#include /* Example of an argument list */* Note that we need a program name for argv0 */char *const ps_argv = “ps”, “ax”, 0;/* Example environment, not terribly useful */char *const ps_envp = “PATH=/b
47、in:/usr/bin”, “TERM=console”, 0;/* Possible calls to exec functions */execl(“/bin/ps”, “ps”, “ax”, 0); /* assumes ps is in /bin */execlp(“ps”, “ps”, “ax”, 0); /* assumes /bin is in PATH */execle(“/bin/ps”, “ps”, “ax”, 0, ps_envp); /* passes own environment */execv(“/bin/ps”, ps_argv);execvp(“ps”, ps
48、_argv);execve(“/bin/ps”, ps_argv, ps_envp);北京交通大学 电子信息工程学院 562022-6-7进程操作进程操作n进程退出进程退出 发生下列情况之一进程退出: 从main函数返回. 调用了exit()函数. 发生异常. 进程应该为其父进程返回退出状态。 退出时: 所有退出处理函数都会被调用 (用atexit()注册这些函数) 所有内存,文件描述符和其他资源都被系统释放。北京交通大学 电子信息工程学院 572022-6-7应用编程基础应用编程基础n应用程序编译n文件操作n进程操作n进程间通信进程间通信北京交通大学 电子信息工程学院 582022-6-7进
49、程间通信进程间通信n进程间通信进程间通信 多任务编程的重要手段,实现功能: 进程间数据交换 任务间同步 对共享资源访问的保护 Linux 下的进程通信手段基本上是从Unix 平台上的进程通信手段继承而来的。最初UNIX进程间通信SystemV进程间通信Socket进程间通信POSIX进程间通信Linux进程间通信北京交通大学 电子信息工程学院 592022-6-7进程间通信进程间通信n常用的进程间通信方式常用的进程间通信方式 管道(Pipe)及有名管道(named pipe,FIFO): 管道可用于具有亲缘关系进程间的通信 有名管道除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。 信
50、号(Signal) 信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一样的。 消息队列(Messge Queue) 消息队列是消息的链接表,包括Posix 消息队列SystemV 消息队列。它克服了前两种通信方式中信息量有限的缺点。北京交通大学 电子信息工程学院 602022-6-7进程间通信进程间通信n常用的进程间通信方式常用的进程间通信方式 共享内存(Shared memory) 最有效的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更