版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Linux编程基础北京交通大学
电子信息工程学院
22023/6/3应用编程基础应用程序编译文件操作进程操作进程间通信北京交通大学
电子信息工程学院
32023/6/3应用程序的编译GNU工具链GNU是“GNU'sNotUnix”的递归缩写RichardStallman创立自由软件基金会(FreeSoftwareFoundation)支持GNU计划GNU软件遵守协议:GPL:GNU通用公共许可证(GNUGeneralPublicLicense)LGPL:GNU较宽松公共许可证(GNULesserGeneralPublicLicense)GFDL:GNU自由文档许可证(GNUFreeDocumentationLicense)GCC(GNUCompilerCollection,GNU编译器集合)GNU工具与Linux的结合:GNU/Linuxhttp:///北京交通大学
电子信息工程学院
42023/6/3应用程序的编译GNU工具链组成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链接。北京交通大学
电子信息工程学院
52023/6/3应用程序的编译GCC集成了多种编译器的编译程序支持C,C++,Fortran,Java等语言可执行文件名字gcc,也可以使用单一语言的编译器命令行启动gcc
hello.c完成编译和连接生成a.out可执行程序,执行此程序./a.out北京交通大学
电子信息工程学院
62023/6/3应用程序的编译GCC编译选项从C语言源程序生成可执行代码文件的过程预处理编译(生成汇编代码)汇编连接GCC用文件名后缀判断编译类型,也可用-x选项强迫GCC从哪个阶段开始用-c,-S,-E选项让编译到某一步结束-c:编译或汇编源文件,不连接,输出.o文件-S:编译后停止,不进行汇编,生成汇编代码.s文件-E:预处理后停止,不编译,预处理后送到stdout用-ofile指定输出文件名,哪一个阶段都有效。例如:gcc
hello.c–ohello北京交通大学
电子信息工程学院
72023/6/3应用程序的编译GCC文件类型约定*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:必须预处理的汇编程序其他:其他扩展名的文件都被作为连接时使用的目标文件北京交通大学
电子信息工程学院
82023/6/3应用程序的编译GNUmake工具和Makefile命令行调用gcc只能处理简单的源文件较少的程序,复杂的软件项目包含大量源程序和头文件,需要借助make工具来自动编译。GNUmake工具:自动化管理工具,管理软件编译的内容、方式和时机自动处理源文件模块之间的包含和引用关系方便将软件项目的代码分开放在多个源文件中,只对更新的代码进行编译,提高工作效率。文件Makefile用来告诉make工具如何根据依赖的源文件产生目标代码make工具也可以用来进行一般的文件处理,从多个输入文件来产生输出文件。北京交通大学
电子信息工程学院
92023/6/3应用程序的编译代码的Build过程Build工具的目标:使用build命令从输入文件(依赖文件)产生可执行文件(目标)可以同时产生多个目标(例如ARM,X86,DSP)方法:命令行,脚本工具makeBuild工具Build指令源文件“Dependencies”app.capp.cfgapp.happ.x64Papp.xv5Tapp.x470MVapp.x86U可执行文件“Targets”app.oapp.lib“D”“CMD”“T”北京交通大学
电子信息工程学院
102023/6/3应用程序的编译基于命令行的build从输入文件app.c产生一个目标文件app.o
gcc–g–capp.c–oapp.o从目标代码app.o产生一个可执行文件(app.x86U)
gcc–gapp.o–oapp.x86U命令commandflagdependencyflagtargetCommandLine依赖文件app.capp.oapp.oapp.x86U目标“D”“CMD”“T”-c=compileonly-g=buildwithdebugenabled-o=outputfilename北京交通大学
电子信息工程学院
112023/6/3应用程序的编译利用Makefile的基本规则make依赖文件app.capp.oapp.oapp.x86U目标“D”“CMD”“T”多种脚本工具可用,例如GNUmake,即gMakeMake利用规则来指定构建命令,依赖文件文件和构建目标Make规则的一般形式MakefileTARGET:DEPENDENCY[TAB]COMMANDS…北京交通大学
电子信息工程学院
122023/6/3应用程序的编译利用Makefile的基本规则TARGET:DEPENDENCY[TAB]COMMANDS…命令行变为简单的Makefile规则app.x86U:app.o
gcc–gapp.o–oapp.x86U规则
gcc–gapp.o–oapp.x86Ucommandflagdependencyflagtarget当目标app.x86U依赖的app.o比较它自己更新时,执行其后的命令gcc。北京交通大学
电子信息工程学院
132023/6/3应用程序的编译简单的Makefile*make依赖文件app.capp.oapp.oapp.x86U目标“D”“CMD”“T”Makefile
gcc–c–gapp.c–oapp.o
gcc–gapp.o–oapp.x86U命令行
#Makefileforapp.x86U(目标)app.x86U:app.o
gcc–gapp.o–oapp.x86Uapp.o:app.c
gcc–g–capp.c–oapp.o
Makefile北京交通大学
电子信息工程学院
142023/6/3应用程序的编译用户定义变量和包含文件用户定义变量简化Makefile增加可读性包含文件可以指定路径等includepath.makCC:=$(CC_DIR)gccCFLAGS:=-gLINK_FLAGS:=-oapp.x86U:app.o$(CC)$(CFLAGS)$^$(LINK_FLAGS)$@CC_DIR:=/usr/bin/...#otherpathsgohere…Makefilepath.mak变量定义、赋值$变量名:引用自定义变量引用内建变量北京交通大学
电子信息工程学院
152023/6/3应用程序的编译使用内建变量使用make的内建变量简化Makefile增加可读性
$@=目标名
$^=所有依赖文件
$<=仅第一个依赖文件内建变量只在当前规则中有效app.x86U:app.o
gcc–gapp.o–oapp.x86Uapp.x86U:app.o
gcc–g$^–o$@简化为北京交通大学
电子信息工程学院
162023/6/3应用程序的编译使用隐含规则使用make的隐含规则简化Makefile例如:.c文件编译成.o文件规则可以自动推导,不需要写出来CC=gccOBJS=main.o
display.o
input.omyprog:$(OBJS) $(CC)$(OBJS)–o$@main.o:common.hdisplay.o:display.h
common.hinput.o:input.h
common.hclean:
rm–fmyprog$(OBJS)北京交通大学
电子信息工程学院
172023/6/3应用程序的编译使用隐含规则使用make的隐含规则简化Makefile例如:.c文件编译成.o文件规则可以自动推导,不需要写出来CC=gccOBJS=main.o
display.o
input.omyprog:$(OBJS) $(CC)$(OBJS)–o$@main.o:main.c
common.hdisplay.o:display.c
display.h
common.hinput.o:input.c
input.h
common.hclean:
rm–fmyprog$(OBJS)CC=gccOBJS=main.o
display.o
input.omyprog:$(OBJS) $(CC)$(OBJS)–o$@clean:
rm–fmyprog$(OBJS)北京交通大学
电子信息工程学院
182023/6/3应用程序的编译Makefile的目标可以指定目标进行处理例如:makeclean,makeinstall不加参数启动make,则执行Makefile中的第一个目标下例中的clean为特殊目标,不产生文件。加上PHONY说明,该目标不做检查直接运行。-rm表示不检查rm可能的错误而继续进行。CC=gccOBJS=main.o
display.o
input.omyprog:$(OBJS) $(CC)$(OBJS)–o$@.PHONY:cleanclean: -rm–fmyprog$(OBJS)北京交通大学
电子信息工程学院
192023/6/3应用编程基础应用程序编译文件操作进程操作进程间通信北京交通大学
电子信息工程学院
202023/6/3文件操作程序API和系统调用POSIX(PortableOperatingSystemInterface)IEEE提出的一套规范定义了所有必要的操作系统函数的名字、接口方式和特性Linux遵循POSIX及其超集SingleUnixSpecification标准Linux给编程者提供一套称为系统调用的接口函数,这些函数符合POSIX规范.系统调用是底层接口,由程序直接调用可能会效率很低。为了提供对设备和磁盘文件的高级接口,Linux的发布版本提供标准函数供应用程序调用。北京交通大学
电子信息工程学院
212023/6/3文件操作用户界面和程序接口示意图Shell&utilitiesStandardlibraries(open,read,fork…)LinuxOS(process/memorymanagement,filesystem,I/O)DevicedriversUsersUserapplicationsUserinterfaceLibraryinterfaceSystemcallinterface用户
模式内核
模式北京交通大学
电子信息工程学院
222023/6/3文件操作查看应用程序的系统调用strace
程序名例子:strace
lsexecve("/bin/ls",["ls"],[/*70vars*/])=0brk(0)=0x9de000access("/etc/ld.so.nohwcap",F_OK)=-1ENOENT(Nosuchfileordirectory)mmap(NULL,8192,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,-1,0)=0x7f7192cc8000access("/etc/ld.so.preload",R_OK)=-1ENOENT(Nosuchfileordirectory)open("/etc/ld.so.cache",O_RDONLY|O_CLOEXEC)=3fstat(3,{st_mode=S_IFREG|0644,st_size=79900,...})=0mmap(NULL,79900,PROT_READ,MAP_PRIVATE,3,0)=0x7f7192cb4000close(3)=0access("/etc/ld.so.nohwcap",F_OK)=-1ENOENT(Nosuchfileordirectory)open("/lib/x86_64-linux-gnu/libselinux.so.1",O_RDONLY|O_CLOEXEC)=3read(3,"\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0[\0\0\0\0\0\0"...,832)=832......北京交通大学
电子信息工程学院
232023/6/3文件操作访问文件的两级接口低级函数(基于文件描述符)用来访问设备驱动和系统调用,主要包括open:打开文件和设备read:读打开的文件/设备write:写文件或设备close:关闭文件/设备ioctl:向设备驱动传递控
制信息低级函数对应一个系统调用高级接口由标准库函数提供。
例如头文件stdio.h中定义的
函数属于标准I/O函数库,这些函数可以提供输出缓冲。北京交通大学
电子信息工程学院
242023/6/3文件操作文件描述符每个运行的程序称为一个进程,拥有若干与之关联的文件描述符。文件描述符是非负整数,用来访问文件或设备。当一个进程请求打开或建立一个文件时,Linux内核会返回一个与该进程关联的文件描述符。当一个程序启动时,系统通常会给它打开了3个文件描述符:0:标准输入STDIN_FILENO1:标准输出STDOUT_FILENO2:标准错误输出STDERR_FILENO北京交通大学
电子信息工程学院
252023/6/3文件操作低级文件访问:writewrite系统调用将缓冲区buf中的数据的前面nbytes字节写入文件描述符fildes指定的文件中,返回实际读取的字节数。#include<unistd.h>size_t
write(int
fildes,constvoid*buf,size_t
nbytes);/*simple_write.c*/#include<unistd.h>#include<stdlib.h>intmain(){if((write(1,“Hereissomedata\n”,18))!=18)write(2,“Awriteerrorhasoccurred!\n”,30);exit(0);}$./simple_writeHereissomedata$北京交通大学
电子信息工程学院
262023/6/3文件操作低级文件访问:readRead从文件描述符指定的文件中读取最多nbytes字节,将它们放在数据缓冲区buf中,返回实际读取的字节数。#include<unistd.h>size_t
read(int
fildes,void*buf,size_t
nbytes);#include<unistd.h>intmain(){charbuffer[128];
int
nread;
nread=read(0,buffer,128);if(nread==-1)write(2,“Areaderrorhasoccurred\n”,26);if((write(1,buffer,nread))!=nread)write(2,“Awriteerrorhasoccurred\n”,27);}从标准输入读入最多128字节,然后写到标准输出.北京交通大学
电子信息工程学院
272023/6/3文件操作低级文件访问:readRead从文件描述符指定的文件中读取最多nbytes字节,将它们放在数据缓冲区buf中,返回实际读取的字节数。#include<unistd.h>size_t
read(int
fildes,void*buf,size_t
nbytes);#include<unistd.h>#include<stdlib.h>intmain(){charbuffer[128];
int
nread;
nread=read(0,buffer,128);if(nread==-1)write(2,“Areaderrorhasoccurred\n”,26);if((write(1,buffer,nread))!=nread)write(2,“Awriteerrorhasoccurred\n”,27);}$echohellothere|./simple_readhellothere$./simple_read<draft1.txtInthischapterwewillbelookingatfilesanddirectoriesandhowtomanipulatethem.Wewilllearnhowtocreatefiles,$北京交通大学
电子信息工程学院
282023/6/3文件操作低级文件访问:openopen系统调用建立一个新的文件描述符,它建立一个访问一个文件或设备的通道。成功时返回一个文件描述符(非负整数),失败时返回-1。文件描述符是唯一的,不会与其它进程共享。参数path是要打开的文件或设备路径名;参数oflags用来说明打开文件要完成的动作。它是一个必要的访问模式和其他可选模式的组合。参数mode只有当动作是建立新文件时才需要。#include<fcntl.h>int
open(constchar*path,int
oflags);int
open(constchar*path,int
oflags,mode_tmode);北京交通大学
电子信息工程学院
292023/6/3文件操作低级文件访问:openint
open(constchar*path,int
oflags,mode_tmode);基本文件访问模式Mode DescriptionO_RDONLY Openforread-onlyO_WRONLY Openforwrite-onlyO_RDWR Openforreadingandwriting可选的文件访问模式Mode DescriptionO_APPEND: 把数据添加到文件尾部.O_TRUNC: 设置文件长度为0,丢弃已有的内容.O_CREAT: 若需要则按照指定的权限创建该文件.O_EXCL: 与O_CREAT一起使用,保证调用者建立文件。其中之一与可选模式
进行“|”组合北京交通大学
电子信息工程学院
302023/6/3文件操作建立文件时指定初始访问权限int
open(constchar*path,int
oflags,mode_tmode);以O_CREAT作为offlag标志调用open建立新文件时,必须使用第三个参数mode,其取值是由sys/stat.h中定义的标志按位OR组合得到。ReadpermissionWritepermissionExecutepermissionOwnerS_IRUSRS_IWUSRS_IXUSRGroupS_IRGRPS_IWGRPS_IXGRPOtherS_IROTHS_IWOTHS_IXOTHopen(“myfile”,O_CREAT,S_IRUSR|S_IXOTH);$ls-ls
myfile0-r-------x1neilsoftware0Sep2208:11myfile*Example:北京交通大学
电子信息工程学院
312023/6/3文件操作低级文件访问close用close中止文件描述符fildes与文件的关联,使得该文件描述符可以被重新使用。成功关闭返回0,否则返回-1。#include<unistd.h>int
close(int
fildes);北京交通大学
电子信息工程学院
322023/6/3文件操作低级文件访问ioctlioctl用来对文件描述符fildes代表的对象实施某种控制功能,功能由参数cmd指定。函数还可以带有更多参数,取决于特定设备支持的具体功能。例如,让Linux打开键盘上的LED显示:#include<unistd.h>int
ioctl(int
fildes,int
cmd,...);ioctl(tty_fd,KDSETLED,LED_NUM|LED_CAP|LED_SCR);北京交通大学
电子信息工程学院
332023/6/3文件操作低级文件访问lseeklseek用来设定读写文件的指针,确定对文件的下次读写操作的位置。Offset参数给定相对于whence指定位置的偏移量。Whence参数可以为:该调用成功时返回设定位置距离文件起始位置的字节偏移量,失败时返回-1。#include<unistd.h>#include<sys/types.h>off_t
lseek(int
fildes,off_toffset,intwhence);❑SEEK_SET: offset为绝对位置❑SEEK_CUR: offset相对于当前位置❑SEEK_END: offset相对于文件结尾北京交通大学
电子信息工程学院
342023/6/3文件操作标准输入/输出的重新定向*打开文件得到的新文件描述符总是可用的最小数值,这在某些场合是非常有用的。例如,重新定向标准输出到一个文件:#include<fcntl.h>#include<stdio.h>intmain(){
int
fd;close(1);
fd=open("Myfile",O_WRONLY);
if(fd!=-1){
printf("AddalinetoMyfile.\n");
write(fd,“Outputtoafile!\n”,19);
close(fd);}}北京交通大学
电子信息工程学院
352023/6/3文件操作标准I/O函数库标准I/O库(stdio)及其头文件stdio.h提供了灵活多样的函数来连接底层I/O系统调用。此标准库现在是ANSI标准C的一部分,提供复杂的输出格式和输入扫描格式,对某些设备提供缓冲服务。需要打开一个文件建立访问通道。打开的文件用一个指向数据结构的指针FILE*来表示,作为其他IO函数的引用参数。标准IO函数将文件内容看成是数据流。当程序启动时系统自动打开3个流文件,即stdin,stdout,和stderr,代表标准输入、标准输出和错误输出,分别对应于底层文件描述符0,1和2。北京交通大学
电子信息工程学院
362023/6/3文件操作标准I/O函数库在头文件stdio.h定义的函数包括以下常用函数相对于底层文件访问函数,高层函数我们更为熟悉,在此不多讨论。❑fopen,fclose❑fread,fwrite❑fflush❑fseek❑fgetc,getc,getchar❑fputc,putc,putchar❑fgets,gets❑printf,fprintf,andsprintf❑scanf,fscanf,andsscanf北京交通大学
电子信息工程学院
372023/6/3文件操作标准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,北京交通大学
电子信息工程学院
382023/6/3文件操作标准I/O函数的缓冲效果例子:全缓冲(1024字节缓冲区)#include<stdio.h>#include<stdlib.h>intmain(){
inti=0;
for(i=0;i<260;i++)//每次向缓冲区内写4个字符
{/*printf("%03d\n",i);*/fprintf(stdout,"%03d",i);/*fflush(stdout);*//*sleep(1);*/}while(1);//避免程序结束,等待缓冲区填充。}北京交通大学
电子信息工程学院
392023/6/3应用编程基础应用程序编译文件操作进程操作进程间通信北京交通大学
电子信息工程学院
402023/6/3进程操作Linux进程“EverythinginUnixisafile.
EverythinginUnixthatisnotafileisaprocess”进程程序的一个运行实例一个程序可以同时有多个运行实例与进程相关的数据:打开的文件,分配的内存,进程ID,父进程ID,优先级,状态…进程相互独立,并发执行.进程由操作系统调度。Linux用task数据结构来管理进程,其中包含了描述进程的PID,PPID等数据。北京交通大学
电子信息工程学院
412023/6/3进程操作Linux进程进程封装了一个程序以及与其相关的所有资源。每个进程程序有自己的进入点main()函数每个进程有自己的虚拟内存空间,与其他进程内存空间隔离。例:显示当前所有的用户进程$ps-ef例:显示当前终端上运行的进程%psPIDTTYTIMECMD21693pts/800:00:00bash21694pts/800:00:00ps北京交通大学
电子信息工程学院
422023/6/3进程操作Linux进程显示进程自己ID和父进程ID#include<stdio.h>#include<unistd.h>intmain(){printf(“TheprocessIDis%d\n”,(int)getpid());printf(“TheparentprocessIDis%d\n”,(int)getppid());return0;}北京交通大学
电子信息工程学院
432023/6/3进程操作并行执行的进程//audio_video.cint
main(int
argc,char*argv[]){
while(condition==TRUE){
callAudioFxn();
callVideoFxn(); }}//audio.c,handlesaudioonlyint
main(int
argc,char*argv[]){
while(condition==TRUE)
callAudioFxn();}方法1:在一个进程中处理音频和视频//video.c,handlesvideoonlyint
main(int
argc,char*argv[]){
while(condition==TRUE)
callVideoFxn();}方法2:在不同进程中分别处理音频和视频分开两个进程的好处:不同的处理速率,不同的优先级可能需要多个音频/视频通道(模块化)需要各自内存保护北京交通大学
电子信息工程学院
442023/6/3进程操作在终端中观察进程ps
ux列出属于当前用户的所有进程psaux列出运行在系统上的所有进程ps-auxUSERPID%CPU%MEMVSZRSSTTYSTATSTARTTIMECOMMANDbart30390.00.259161380pts/2S14:350:00/bin/bashbart31340.00.253881380pts/3S14:360:00/bin/bashbart31900.00.263681360pts/4S14:370:00/bin/bashbart34160.00.00 0pts/2R15:070:00[bash]...PID: ProcessidVSZ: Virtualprocesssize(code+data+stack)RSS: Processresidentsize:numberofKBcurrentlyinRAMTTY: TerminalSTAT: Status: R(Runnable),S(Sleep),D(Uninterruptedsleep),Z(Zombie),T(Traced)北京交通大学
电子信息工程学院
452023/6/3进程操作管理背景任务进程启动任务在背景运行
./sleep30&显示同一个shell里面背景任务
jobs-l[1]-sleep30&把最后一个/第n个背景任务放到前台运行
fg
fg%n把当前任务放到背景去运行
[Ctrl-Z]
bg中止第n个任务
kill%n北京交通大学
电子信息工程学院
462023/6/3进程操作/proc虚拟文件系统该目录下的虚拟文件给出系统和进程相关信息/proc/version操作系统版本/proc/cpuinfo处理器信息/proc/<pid>/进程ID目录下为该进程信息cmdline
命令行cwd
当前目录environ环境变量fd/子目录,打开的文件描述符maps映射到进程地址空间的文件,程序,库文件,etsexe可执行映像的符号连接......北京交通大学
电子信息工程学院
472023/6/3进程操作在程序中建立新进程系统中所有进程都是从一个原始进程分裂出来,这个原始进程是启动时建立的。当使用fork系统调用时,两个进程执行相同的代码。可以检测谁是新进程并让它执行另外一个程序(调用exec)将一个执行的
进程分裂为
两个相同的环境新进程替代
老进程但维持
以前的环境启动新进程
同时
保留老进程forkexecfork+exec北京交通大学
电子信息工程学院
482023/6/3进程操作在C程序中复制进程调用系统调用函数fork建立一个新进程.Fork建立的子进程克隆了父进程的数据和环境当从fork返回时,两个进程运行相同的程序,程序如何知道处在哪一个进程中?对于父进程,Fork会返回子进程的PID,对于子进程,fork返回0。#include<sys/types.h>#include<unistd.h>pid_t
fork(void);北京交通大学
电子信息工程学院
492023/6/3进程操作在C程序中复制进程Whichiswhich?
pid_t
new_pid;
new_pid=fork();
switch(new_pid){case-1:/*Error*/break;case0:/*It’schild*/break;default:/*It’sparent*/break;}北京交通大学
电子信息工程学院
502023/6/3进程操作等待进程结束intmain(){
pid_t
pid;
intstatus;
pid=fork();
switch(pid){case-1:
pprintf("forkfailed");exit(1);case0:
printf("I'mthechild!\n");exit(0);default:
printf("I'mtheparent!\n");
wait(&status);if(WIFEXITED(status))
printf("Childexistwithstatusof%d\n",
WEXITSTATUS(status));}exit(0);}#include<sys/types.h>#include<sys/wait.h>#include<unistd.h>#include<stdio.h>#include<stdlib.h>北京交通大学
电子信息工程学院
512023/6/3进程操作建立进程执行新程序pid_t
pid;if(pid=fork()){
intstatus;
printf("I'mtheparent!\n");
wait(&status);}else{
printf("I'mthechild!\n");
execve(“/bin/ls”,argv,envp);}此调用将会用存储在指定路径中的程序替换内存中的程序映像(代码和数据)。先前打开的文件描述符,优先级和其他属性保持不变。北京交通大学
电子信息工程学院
522023/6/3进程操作执行新程序例子#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<unistd.h>intmain(){/*传递给“ls”命令的参数列表*/char*arg_list[]={"ls","-l","/",NULL};spawn("ls",arg_list);
printf("donewithmainprogram\n");return0;}北京交通大学
电子信息工程学院
532023/6/3进程操作执行新程序例子#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<unistd.h>intmain(){/*传递给“ls”命令的参数列表*/char*arg_list[]={"ls","-l","/",NULL};spawn("ls",arg_list);
printf("donewithmainprogram\n");return0;}intspawn(char*program,char**arg_list){
pid_t
child_pid;/*复制一个进程*/
child_pid=fork();if(child_pid!=0){/*这是父进程,返回.*/sleep(30);/*父进程结束前可观察僵尸子进程*/returnchild_pid;}else{/*子进程,执行程序ls.*/
execvp(program,arg_list);/*execvp函数只有出错时才返回*/
fprintf(stderr,"Anerroroccurred\n");abort();}}北京交通大学
电子信息工程学院
542023/6/3进程操作exec函数族用来替换当前进程执行的程序不同的变种,启动进程和传递参数的方式有差别。以p结尾的形式在环境变量PATH中搜索程序的位置以e结尾的形式可传递自定义的环境变量#include<unistd.h>char**environ;int
execl(constchar*path,constchar*arg0,..,(char*)0);int
execlp(constchar*file,constchar*arg0,..,(char*)0);int
execle(constchar*path,constchar*arg0,..,(char*)0,char*constenvp[]);int
execv(constchar*path,char*constargv[]);int
execvp(constchar*file,char*constargv[]);int
execve(constchar*path,char*constargv[],char*constenvp[]);北京交通大学
电子信息工程学院
552023/6/3进程操作exec函数族#include<unistd.h>/*Exampleofanargumentlist*//*Notethatweneedaprogramnameforargv[0]*/char*constps_argv[]={“ps”,“ax”,0};/*Exampleenvironment,notterriblyuseful*/char*constps_envp[]={“PATH=/bin:/usr/bin”,“TERM=console”,0};/*Possiblecallstoexec
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 居间协议书 法律效力
- 2025-2026学年安徽省淮南市高一数学上册期中考试试卷及答案
- 被裁员还需要遵守竞业协议书
- 数学教学方法培训
- 国内生产总值的计算方法
- 力量足球训练课件
- 膝关节置换术后康复训练及注意事项
- 2025版康复医学常见疾病症状及护理指南
- 热爱校园的方法
- 介绍遂昌青团
- 衣食住行见证改革开放时代变迁-(修订)
- 书法鉴赏 (浙江财大版)学习通超星期末考试答案章节答案2024年
- 2024年秋季新人教版九年级上册化学全册教案
- 介入治疗常见并发症及护理
- 小学作文教学困境分析及对策研究
- 六孔陶笛带歌词48首曲谱
- 电测应力应变实验课件ppt
- 大学生研究生就业方案
- 乘法小故事小学二年级
- 中考模拟考试语文答题卡Word版可以编辑(全黑色)
- 2023年度广东省成人高考《英语》(高升本)真题库及答案(单选题型)
评论
0/150
提交评论