- 1、本文档共23页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
管道
管道进程通信的方式无名管道有名管道
进程通信方式Linux有多种进程间通信(IPC)方式,如果没有IPC,进程只能通过文件系统互相交换信息。常用的IPC有如下几种:PIPEFIFO共享内存信号量消息队列邮箱
管道管道分为两种无名管道(pipe):是与内存中的一个索引节点相关联的两个文件描述符,没有名字,不会在文件系统中出现。有名管道(fifo):出现于文件系统当中,遵循先入先出的原则来读取数据。pipe、fifo的名称并非硬性规定
管道
无名管道管道是半双工,数据只能单向传递管道只能在相关的、有共同祖先的进程之间使用
创建无名管道创建管道使用pipe调用,关闭管道使用close调用如果成功建立了管道,则会打开两个文件描述符并把它们的值保存在一个整数数组中。其中,filedes[0]用于读出数据,filedes[1]用来写入数据。成功返回0,否则返回-1。#includeunistd.hintpipe(intfiledes[2]);
#includeunistd.h#includestdio.h#includestdlib.hintmain(void){ intfd[2];/*Arrayforfiledescriptors*/ if((pipe(fd))0) { perror(pipe); exit(EXIT_FAILURE); } printf(descriptorsare%d,%d\n,fd[0],fd[1]); close(fd[0]); close(fd[1]); exit(EXIT_SUCCESS);}
读写管道从管道读出数据和写入数据,只要简单的使用read和write调用即可。read从fd[0]中读取数据,write向fd[1]中写入数据。如果父进程向子进程发送数据,则父进程需关闭fd[0]并向fd[1]写入数据,子进程需关闭fd[1],并从fd[0]读取数据。反之亦然
#includeunistd.h#includesys/types.h#includesys/wait.h#includestdio.h#includestdlib.h#includefcntl.h#includelimits.h#defineBUFSZPIPE_BUFvoiderr_quit(char*msg);intmain(intargc,char*argv[]){ intfd[2];/*Filedescriptorarrayforthepipe*/ intfdin;/*Descriptorforinputfile*/ charbuf[BUFSZ]; intpid,len;无名管道举例
/*Createthepipe*/ if((pipe(fd))0) err_quit(pipe); /*Forkandclosetheappropriatedescriptors*/ if((pid=fork())0) err_quit(fork); if(pid==0){ /*Childisreader,closethewritedescriptor*/ close(fd[1]); while((len=read(fd[0],buf,BUFSZ))0) write(STDOUT_FILENO,buf,len); close(fd[0]); } else{ /*Parentiswriter,closethereaddescriptor*/ close(fd[0]); if((fdin=open(argv[1],O_RDONLY))0) { perror(open); /*Sendsomething*/ write(fd[1],123\n,4); }
else{ while((len=read(fdin,buf,BUFSZ))0) write(fd[1],buf,len); close(fdin); } /*Closethewritedescriptor*/ close(fd[1]); } /*Reaptheexitstatus*/ waitpid(pid,NULL,0); exit(EXIT_SUCCESS);} voiderr_quit(char*msg){ perror(msg); exit(EXIT_FAILURE);}cat功能的又一实现
有名管道有名管道(FIFO)存在于文件系统中,功能比无名管道强大,可以让无关联的进程交
文档评论(0)