Linux应用编程基础课件

上传人:文**** 文档编号:241666204 上传时间:2024-07-14 格式:PPT 页数:65 大小:430.14KB
返回 下载 相关 举报
Linux应用编程基础课件_第1页
第1页 / 共65页
Linux应用编程基础课件_第2页
第2页 / 共65页
Linux应用编程基础课件_第3页
第3页 / 共65页
点击查看更多>>
资源描述
Linux编程基础编程基础Linux编程基础北京交通大学 电子信息工程学院 22024/7/14应用编程基础应用编程基础n应用程序编译应用程序编译n文件操作n进程操作n进程间通信 北京交通大学 电子信息工程学院 22023/8/14应用编程北京交通大学 电子信息工程学院 32024/7/14应用程序的编译应用程序的编译nGNU工具链GNU是“GNUs Not Unix”的递归缩写Richard Stallman创立自由软件基金会(Free Software Foundation)支持GNU计划GNU软件遵守协议:GPL:GNU通用公共许可证(GNU General Public License)LGPL:GNU较宽松公共许可证(GNU Lesser General Public License)GFDL:GNU自由文档许可证(GNU Free Documentation License)GCC(GNU Compiler Collection,GNU编译器集合)GNU工具与Linux的结合:GNU/Linuxhttp:/www.gnu.org/北京交通大学 电子信息工程学院 32023/8/14应用程序北京交通大学 电子信息工程学院 42024/7/14应用程序的编译应用程序的编译nGNU工具链组成Binutils:一组用于编译、链接、汇编和其他调试目的的程序,包括ar,as,ld,nm,objcopy,objdump,ranlib,readelf,size,strings,strip等。gcc:gnu的编译器集合,Linux环境使用的C语言编译器glibc:gnu的C语言标准函数库。该库实现Linux系统函数,例如open、read等,也实现标准C语言库,如printf等。几乎所有应用程序都需要与glibc链接。北京交通大学 电子信息工程学院 42023/8/14应用程序北京交通大学 电子信息工程学院 52024/7/14应用程序的编译应用程序的编译nGCC集成了多种编译器的编译程序支持C,C+,Fortran,Java等语言可执行文件名字gcc,也可以使用单一语言的编译器命令行启动命令行启动gcc hello.c完成编译和连接生成a.out可执行程序,执行此程序./a.out北京交通大学 电子信息工程学院 52023/8/14应用程序北京交通大学 电子信息工程学院 62024/7/14应用程序的编译应用程序的编译nGCC编译选项编译选项从C语言源程序生成可执行代码文件的过程预处理编译(生成汇编代码)汇编连接GCC用文件名后缀判断编译类型,也可用-x选项强迫GCC从哪个阶段开始用-c,-S,-E选项让编译到某一步结束-c:编译或汇编源文件,不连接,输出.o文件-S:编译后停止,不进行汇编,生成汇编代码.s文件-E:预处理后停止,不编译,预处理后送到stdout用用-o file指定输出文件名,哪一个阶段都有效指定输出文件名,哪一个阶段都有效。例如:gcc hello.c o hello北京交通大学 电子信息工程学院 62023/8/14应用程序北京交通大学 电子信息工程学院 72024/7/14应用程序的编译应用程序的编译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:必须预处理的汇编程序其他:其他扩展名的文件都被作为连接时使用的目标文件北京交通大学 电子信息工程学院 72023/8/14应用程序北京交通大学 电子信息工程学院 82024/7/14应用程序的编译应用程序的编译nGNU make工具和工具和Makefile命令行调用gcc只能处理简单的源文件较少的程序,复杂的软件项目包含大量源程序和头文件,需要借助make工具来自动编译。GNU make工具:自动化管理工具,管理软件编译的内容、方式和时机自动处理源文件模块之间的包含和引用关系方便将软件项目的代码分开放在多个源文件中,只对更新的代码进行编译,提高工作效率。文件Makefile用来告诉make工具如何根据依赖的源文件产生目标代码make工具也可以用来进行一般的文件处理,从多个输入文件来产生输出文件。北京交通大学 电子信息工程学院 82023/8/14应用程序北京交通大学 电子信息工程学院 92024/7/14应用程序的编译应用程序的编译n代码的代码的Build过程过程Build工具的目标:使用build命令从输入文件(依赖文件)产生可执行文件(目标)可以同时产生多个目标(例如ARM,X86,DSP)方法:命令行,脚本工具makeBuild工具工具Build 指令指令源文件源文件“Dependencies”app.capp.cfgapp.happ.x64Papp.xv5Tapp.x470MVapp.x86U可执行文件可执行文件“Targets”app.oapp.lib“D”“CMD”“T”北京交通大学 电子信息工程学院 92023/8/14应用程序北京交通大学 电子信息工程学院 102024/7/14应用程序的编译应用程序的编译n基于命令行的基于命令行的build 从输入文件从输入文件app.c产生一个目标文件产生一个目标文件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北京交通大学 电子信息工程学院 102023/8/14应用程北京交通大学 电子信息工程学院 112024/7/14应用程序的编译应用程序的编译n利用利用Makefile的基本规则的基本规则 make依赖文件app.capp.oapp.oapp.x86U目标“D”“CMD”“T”多种脚本工具可用,例如GNU make,即gMakeMake利用规则来指定构建命令,依赖文件文件和构建目标Make规则的一般形式MakefileTARGET:DEPENDENCYTAB COMMANDS北京交通大学 电子信息工程学院 112023/8/14应用程北京交通大学 电子信息工程学院 122024/7/14应用程序的编译应用程序的编译n利用利用Makefile的基本规则的基本规则 TARGET:DEPENDENCYTAB COMMANDS命令行 变为简单的Makefile规则app.x86U :app.o gcc g app.o o app.x86U规则规则 gcc g app.o o app.x86Ucommandflagdependencyflagtarget当目标目标app.x86U依赖依赖的app.o比较它自己更新时,执行其后的命令命令gcc。北京交通大学 电子信息工程学院 122023/8/14应用程北京交通大学 电子信息工程学院 132024/7/14应用程序的编译应用程序的编译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(目标目标)app.x86U:app.ogcc g app.o o app.x86Uapp.o:app.cgcc g c app.c o app.o Makefile北京交通大学 电子信息工程学院 132023/8/14应用程北京交通大学 电子信息工程学院 142024/7/14应用程序的编译应用程序的编译n用户定义变量和包含文件用户定义变量和包含文件 用户定义变量简化Makefile增加可读性包含文件可以指定路径等include path.makCC:=$(CC_DIR)gccCFLAGS:=-gLINK_FLAGS:=-oapp.x86U:app.o$(CC)$(CFLAGS)$(LINK_FLAGS)$CC_DIR:=/usr/bin/.#other paths go hereMakefilepath.mak变量定义、赋值$变量名:引用自定义变量引用内建变量北京交通大学 电子信息工程学院 142023/8/14应用程北京交通大学 电子信息工程学院 152024/7/14应用程序的编译应用程序的编译n使用内建变量使用内建变量 使用make的内建变量简化Makefile增加可读性$=目标名$=所有依赖文件$010000000000.,832)=832.北京交通大学 电子信息工程学院 222023/8/14文件操北京交通大学 电子信息工程学院 232024/7/14文件操作文件操作n访问文件的两级接口访问文件的两级接口 低级函数低级函数(基于文件描述符)用来访问设备驱动和系统调用,主要包括open:打开文件和设备read:读打开的文件/设备write:写文件或设备close:关闭文件/设备ioctl:向设备驱动传递控制信息低级函数对应一个系统调用高级接口由标准库函数提供。例如头文件stdio.h中定义的函数属于标准标准 I/O函数函数库,这些函数可以提供输出缓冲。北京交通大学 电子信息工程学院 232023/8/14文件操北京交通大学 电子信息工程学院 242024/7/14文件操作文件操作n文件描述符文件描述符 每个运行的程序称为一个进程,拥有若干与之关联的文件描述符。文件描述符是非负整数,用来访问文件或设备。当一个进程请求打开或建立一个文件时,Linux内核会返回一个与该进程关联的文件描述符。当一个程序启动时,系统通常会给它打开了3个文件描述符:0:标准输入 STDIN_FILENO1:标准输出 STDOUT_FILENO2:标准错误输出 STDERR_FILENO北京交通大学 电子信息工程学院 242023/8/14文件操北京交通大学 电子信息工程学院 252024/7/14文件操作文件操作n低级文件访问低级文件访问 :write write系统调用将缓冲区buf中的数据的前面nbytes字节写入文件描述符fildes指定的文件中,返回实际读取的字节数。#include size_t write(int fildes,const void*buf,size_t nbytes);/*simple_write.c */#include#include 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$北京交通大学 电子信息工程学院 252023/8/14文件操北京交通大学 电子信息工程学院 262024/7/14文件操作文件操作n低级文件访问低级文件访问 :read Read 从文件描述符指定的文件中读取最多nbytes字节,将它们放在数据缓冲区buf中,返回实际读取的字节数。#include size_t read(int fildes,void*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字节,然后写到标准输出.北京交通大学 电子信息工程学院 262023/8/14文件操北京交通大学 电子信息工程学院 272024/7/14文件操作文件操作n低级文件访问低级文件访问 :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)!=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,$北京交通大学 电子信息工程学院 272023/8/14文件操北京交通大学 电子信息工程学院 282024/7/14文件操作文件操作n低级文件访问低级文件访问 :open open系统调用建立一个新的文件描述符,它建立一个访问一个文件或设备的通道。成功时返回一个文件描述符(非负整数),失败时返回-1。文件描述符是唯一的,不会与其它进程共享。参数path是要打开的文件或设备路径名;参数oflags用来说明打开文件要完成的动作。它是一个必要的访问模式和其他可选模式的组合。参数mode只有当动作是建立新文件时才需要。#include int open(const char*path,int oflags);int open(const char*path,int oflags,mode_t mode);北京交通大学 电子信息工程学院 282023/8/14文件操北京交通大学 电子信息工程学院 292024/7/14文件操作文件操作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_TRUNC:设置文件长度为0,丢弃已有的内容.O_CREAT:若需要则按照指定的权限创建该文件.O_EXCL:与 O_CREAT一起使用,保证调用者建立文件。其中之一与可选模式进行“|”组合北京交通大学 电子信息工程学院 292023/8/14文件操北京交通大学 电子信息工程学院 302024/7/14文件操作文件操作n建立文件时指定初始访问权限建立文件时指定初始访问权限 int open(const char*path,int oflags,mode_t mode);n以O_CREAT作为offlag标志调用 open建立新文件时,必须使用第三个参数mode,其取值是由sys/stat.h中定义的标志按位OR组合得到。Read permissionWrite 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:北京交通大学 电子信息工程学院 302023/8/14文件操北京交通大学 电子信息工程学院 312024/7/14文件操作文件操作n低级文件访问低级文件访问 close用 close中止文件描述符 fildes与文件的关联,使得该文件描述符可以被重新使用。成功关闭返回0,否则返回-1。#include int close(int fildes);北京交通大学 电子信息工程学院 312023/8/14文件操北京交通大学 电子信息工程学院 322024/7/14文件操作文件操作n低级文件访问低级文件访问 ioctlioctl用来对文件描述符fildes代表的对象实施某种控制功能,功能由参数cmd指定。函数还可以带有更多参数,取决于特定设备支持的具体功能。例如,让Linux打开键盘上的LED显示:#include int ioctl(int fildes,int cmd,.);ioctl(tty_fd,KDSETLED,LED_NUM|LED_CAP|LED_SCR);北京交通大学 电子信息工程学院 322023/8/14文件操北京交通大学 电子信息工程学院 332024/7/14文件操作文件操作n低级文件访问低级文件访问 lseeklseek用来设定读写文件的指针,确定对文件的下次读写操作的位置。Offset参数给定相对于whence指定位置的偏移量。Whence参数可以为:该调用成功时返回设定位置距离文件起始位置的字节偏移量,失败时返回-1。#include#include off_t lseek(int fildes,off_t offset,int whence);SEEK_SET:offset 为绝对位置 SEEK_CUR:offset 相对于当前位置 SEEK_END:offset 相对于文件结尾北京交通大学 电子信息工程学院 332023/8/14文件操北京交通大学 电子信息工程学院 342024/7/14文件操作文件操作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);北京交通大学 电子信息工程学院 342023/8/14文件操北京交通大学 电子信息工程学院 352024/7/14文件操作文件操作n标准标准I/O函数库函数库标准 I/O库(stdio)及其头文件 stdio.h提供了灵活多样的函数来连接底层I/O系统调用。此标准库现在是ANSI标准 C的一部分,提供复杂的输出格式和输入扫描格式,对某些设备提供缓冲服务提供缓冲服务。需要打开一个文件建立访问通道。打开的文件用一个指向数据结构的指针指针FILE*来表示,作为其他IO函数的引用参数。标准IO函数将文件内容看成是数据流。当程序启动时系统自动打开3个流文件流文件,即 stdin,stdout,和stderr,代表标准输入、标准输出和错误输出,分别对应于底层文件描述符 0,1 和 2。北京交通大学 电子信息工程学院 352023/8/14文件操北京交通大学 电子信息工程学院 362024/7/14文件操作文件操作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北京交通大学 电子信息工程学院 362023/8/14文件操北京交通大学 电子信息工程学院 372024/7/14文件操作文件操作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(),一次操作一行格式化输入输出:可以指定输入输出的具体格式,printf、fprintf,sprintf,scanf,fscanf,sscanf,北京交通大学 电子信息工程学院 372023/8/14文件操北京交通大学 电子信息工程学院 382024/7/14文件操作文件操作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);/避免程序结束,等待缓冲区填充。北京交通大学 电子信息工程学院 382023/8/14文件操北京交通大学 电子信息工程学院 392024/7/14应用编程基础应用编程基础n应用程序编译n文件操作n进程操作进程操作n进程间通信北京交通大学 电子信息工程学院 392023/8/14应用编北京交通大学 电子信息工程学院 402024/7/14进程操作进程操作nLinux进程进程“Everything in Unix is a file.Everything in Unix is a file.Everything in Unix that is not a file is a Everything in Unix that is not a file is a processprocess”进程程序的一个运行实例一个程序可以同时有多个运行实例与进程相关的数据:打开的文件,分配的内存,进程ID,父进程ID,优先级,状态进程相互独立,并发执行.进程由操作系统调度。Linux用task数据结构来管理进程,其中包含了描述进程的PID,PPID等数据。北京交通大学 电子信息工程学院 402023/8/14进程操北京交通大学 电子信息工程学院 412024/7/14进程操作进程操作nLinux进程进程进程封装了一个程序以及与其相关的所有资源。每个进程程序有自己的进入点main()函数每个进程有自己的虚拟内存空间,与其他进程内存空间隔离。例:显示当前所有的用户进程$ps-ef例:显示当前终端上运行的进程%psPID TTY TIME CMD21693 pts/8 00:00:00 bash21694 pts/8 00:00:00 ps北京交通大学 电子信息工程学院 412023/8/14进程操北京交通大学 电子信息工程学院 422024/7/14进程操作进程操作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;北京交通大学 电子信息工程学院 422023/8/14进程操北京交通大学 电子信息工程学院 432024/7/14进程操作进程操作n并行执行的进程并行执行的进程/audio_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=TRUE)callVideoFxn();方法方法2:在不同进程中分别处理:在不同进程中分别处理音频和视频音频和视频分开两个进程的好处:分开两个进程的好处:1.不同的处理速率,不同的优先级 2.可能需要多个音频/视频通道(模块化)3.需要各自内存保护北京交通大学 电子信息工程学院 432023/8/14进程操北京交通大学 电子信息工程学院 442024/7/14进程操作进程操作n在终端中观察进程在终端中观察进程nps ux列出属于当前用户的所有进程nps aux列出运行在系统上的所有进程nps-auxUSER PID%CPU%MEM VSZ RSS TTY STAT START TIME COMMANDbart 3039 0.0 0.2 5916 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 currently in RAMTTY:TerminalSTAT:Status:R(Runnable),S(Sleep),D(Uninterrupted sleep),Z(Zombie),T(Traced)北京交通大学 电子信息工程学院 442023/8/14进程操北京交通大学 电子信息工程学院 452024/7/14进程操作进程操作n管理背景任务进程管理背景任务进程n启动任务在背景运行 ./sleep 30&n显示同一个shell里面背景任务 jobs-l 1-sleep 30&n把最后一个/第n个背景任务放到前台运行 fg fg%nn把当前任务放到背景去运行 Ctrl-Z bgn中止第n个任务 kill%n北京交通大学 电子信息工程学院 452023/8/14进程操北京交通大学 电子信息工程学院 462024/7/14进程操作进程操作n/proc虚拟文件系统虚拟文件系统该目录下的虚拟文件给出系统和进程相关信息/proc/version 操作系统版本/proc/cpuinfo处理器信息/proc/进程ID目录下为该进程信息cmdline 命令行cwd 当前目录environ 环境变量fd/子目录,打开的文件描述符maps 映射到进程地址空间的文件,程序,库文件,etsexe 可执行映像的符号连接.北京交通大学 电子信息工程学院 462023/8/14进程操北京交通大学 电子信息工程学院 472024/7/14进程操作进程操作n在程序中建立新进程在程序中建立新进程n系统中所有进程都是从一个原始进程分裂出来,这个原始进程是启动时建立的。n当使用fork系统调用时,两个进程执行相同的代码。n可以检测谁是新进程并让它执行另外一个程序(调用exec)将一个执行的将一个执行的进程分裂为进程分裂为两个相同的环境两个相同的环境新进程替代新进程替代老进程但维持老进程但维持以前的环境以前的环境启动新进程启动新进程同时同时保留老进程保留老进程forkexecfork+exec北京交通大学 电子信息工程学院 472023/8/14进程操北京交通大学 电子信息工程学院 482024/7/14进程操作进程操作n在在C程序中复制进程程序中复制进程n调用系统调用函数fork建立一个新进程.nFork建立的子进程克隆了父进程的数据和环境n当从fork返回时,两个进程运行相同的程序,程序如何知道处在哪一个进程中?n对于父进程,Fork会返回子进程的PID,对于子进程,fork返回0。#include#include pid_t fork(void);北京交通大学 电子信息工程学院 482023/8/14进程操北京交通大学 电子信息工程学院 492024/7/14进程操作进程操作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;北京交通大学 电子信息工程学院 492023/8/14进程操北京交通大学 电子信息工程学院 502024/7/14进程操作进程操作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,WEXITSTATUS(status);exit(0);#include#include#include#include#include 北京交通大学 电子信息工程学院 502023/8/14进程操北京交通大学 电子信息工程学院 512024/7/14进程操作进程操作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);此调用将会用存储在指定路径中的程序替换内存中的程序映像(代码和数据)。先前打开的文件描述符,优先级和其他属性保持不变。北京交通大学 电子信息工程学院 512023/8/14进程操北京交通大学 电子信息工程学院 522024/7/14进程操作进程操作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;北京交通大学 电子信息工程学院 522023/8/14进程操北京交通大学 电子信息工程学院 532024/7/14进程操作进程操作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;int spawn(char*program,char*arg_list)pid_t child_pid;/*复制一个进程*/child_pid=fork();if(child_pid!=0)/*这是父进程,返回.*/sleep(30);/*父进程结束前可观察僵尸子进程*/return child_pid;else /*子进程,执行程序 ls.*/execvp(program,arg_list);/*execvp函数只有出错时才返回*/fprintf(stderr,An error occurredn);abort();北京交通大学 电子信息工程学院 532023/8/14进程操北京交通大学 电子信息工程学院 542024/7/14进程操作进程操作nexec函数族函数族用来替换当前进程执行的程序不同的变种,启动进程和传递参数的方式有差别。以p结尾的形式在环境变量PATH中搜索程序的位置以e结尾的形式可传递自定义的环境变量#include char*environ;int 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(const char*path,char*const argv,char*const envp);北京交通大学 电子信息工程学院 542023/8/14进程操北京交通大学 电子信息工程学院 552024/7/14进程操作进程操作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=/bin:/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_argv);execve(“/bin/ps”,ps_argv,ps_envp);北京交通大学 电子信息工程学院 552023/8/14进程操北京交通大学 电子信息工程学院 562024/7/14进程操作进程操作n进程退出进程退出发生下列情况之一进程退出:从main函数返回.调用了exit()函数.发生异常.进程应该为其父进程返回退出状态。退出时:所有退出处理函数都会被调用(用atexit()注册这些函数)所有内存,文件描述符和其他资源都被系统释放。北京交通大学 电子信息工程学院 562023/8/14进程操北京交通大学 电子信息工程学院 572024/7/14应用编程基础应用编程基础n应用程序编译n文件操作n进程操作n进程间通信进程间通信北京交通大学 电子信息工程学院 572023/8/14应用编北京交通大学 电子信息工程学院 582024/7/14进程间通信进程间通信n进程间通信进程间通信多任务编程的重要手段,实现功能:进程间数据交换任务间同步对共享资源访问的保护Linux 下的进程通信手段基本上是从Unix 平台上的进程通信手段继承而来的。最初UNIX进程间通信SystemV进程间通信Socket进程间通信POSIX进程间通信Linux进程间通信北京交通大学 电子信息工程学院 582023/8/14进程间北京交通大学 电子信息工程学院 592024/7/14进程间通信进程间通信n常用的进程间通信方式常用的进程间通信方式管道(Pipe)及有名管道(named pipe,FIFO):管道可用于具有亲缘关系进程间的通信有名管道除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。信号(Signal)信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一样的。消息队列(Messge Queue)消息队列是消息的链接表,包括Posix 消息队列SystemV 消息队列。它克服了前两种通信方式中信息量有限的缺点。北京交通大学 电子信息工程学院 592023/8/14进程间北京交通大学 电子信息工程学院 602024/7/14进程间通信进程间通信n常用的进程间通信方式常用的进程间通信方式共享内存(Shared memory)最有效的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种通信方式需要依靠某种同步机制,如互斥锁和信号量等。信号量(Semaphore)作为进程之间、同一进程的不同线程之间的同步和互斥手段。套接字(Socket)更为一般的进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。北京交通大学 电子信息工程学院 602023/8/14进程间北京交通大学 电子信息工程学院 612024/7/14应用编程基础应用编程基础n练习练习1编写简单Hello World程序,打印字符串。调用gcc编译,执行。2参考dvar.c程序,编译执行,观察内存变量在虚拟地址空间分布。观察程序打印输出和/proc/pid/maps给出的数据。北京交通大学 电子信息工程学院 612023/8/14应用编北京交通大学 电子信息工程学院 622024/7/14应用编程基础应用编程基础n练习练习3(1)编写一个计算5+(9/3)的程序,要求分成4个文件,一个头文件myhead.h,一个进行加法运算的myadd.c代码文件、一个进行除法的文件mydiv.c和一个调用加法和除法函数的result.c文件,在其中打印计算结果。(2)编写一个Makefile,使它们在make工具下生成可执行文件myresult。同时,还有一个make目标clean可以清除所有编译中间结果和可执行文件。(3)整个项目文件都放在一个目录一个目录cal下面。北京交通大学 电子信息工程学院 622023/8/14应用编CCS编程和调试编程和调试n练习结果提交练习结果提交将以上要求的第3个练习的cal目录压缩成一个文档tar zcvf ex2-n.tar.gz cal 其中n是小组编号将这个压缩文档提交到指定邮箱CCS编程和调试练习结果提交将以上要求的第3个练习的cal目北京交通大学 电子信息工程学院 642024/7/14应用编程基础应用编程基础n参考参考Mark Mitchell,Advanced.Linux.ProgrammingNeil Matthew,Beginning Linux Programming,4th Edition北京交通大学 电子信息工程学院 642023/8/14应用编北京交通大学 电子信息工程学院 652024/7/14北京交通大学 电子信息工程学院 652023/8/14
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!