Linux 进程间通信-管道课件.ppt

Linux 进程间通信-管道课件.ppt

ID:57058130

大小:260.00 KB

页数:37页

时间:2020-07-30

Linux 进程间通信-管道课件.ppt_第1页
Linux 进程间通信-管道课件.ppt_第2页
Linux 进程间通信-管道课件.ppt_第3页
Linux 进程间通信-管道课件.ppt_第4页
Linux 进程间通信-管道课件.ppt_第5页
资源描述:

《Linux 进程间通信-管道课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、第7章进程间通信:管道主要内容管道的定义popen和pclose库函数pipe系统调用父进程和子进程命名管道:FIFO客户/服务器架构2什么是管道管道(pipe)Shell中的管道机制e.g.cmd1

2、cmd2管道是半双工,而且一般是传送方向固定的单向管道管道也是一种文件管道不允许文件定位,读从文件的开始处读。数据在管道中是以先进先出的方式传送写进程读进程管道3popen&pclose函数标准I/O库为实现两个进程之间传递数据提供了两个函数popen和pclose。#includeFILE*popen(constchar*command,constchar

3、*open_mode);intpclose(FILE*stream_to_close);4intmain(){FILE*read_fp;charbuffer[BUFSIZ+1];intchars_read;memset(buffer,'',sizeof(buffer));read_fp=popen("uname-a","r");if(read_fp!=NULL){chars_read=fread(buffer,sizeof(char),BUFSIZ,read_fp);if(chars_read>0){printf("Outputwas:-%s",buffer);

4、}pclose(read_fp);exit(EXIT_SUCCESS);}exit(EXIT_FAILURE);}通过管道读取数据5将输出送往popenintmain(){FILE*write_fp;charbuffer[BUFSIZ+1];sprintf(buffer,"Onceuponatime,therewas...");write_fp=popen("od-c","w");if(write_fp!=NULL){fwrite(buffer,sizeof(char),strlen(buffer),write_fp);pclose(write_fp);exit(EXI

5、T_SUCCESS);}exit(EXIT_FAILURE);}6popen函数分析一方面shell对所有命令参数进行扩展处理,用popen可以启动复杂的shell命令。另一方面,使用shell导致popen实际上派生了两个子进程,占用了较多的系统资源7pipe系统调用pipe函数:创建一个管道,提供对读写数据更多的控制。#includeintpipe(intfiledes[2]);(Returnedvalue:0ifsuccess,-1iffailure)pipe:FIFOfiledes用来保存标识管道的文件描述符,filedes[0]用来从管道读出数

6、据,filedes[1]用来向管道写入数据8单个进程的pipe9#include#include#defineMSGSIZE16char*msg1=“hello,world#1”;char*msg2=“hello,world#2”;char*msg3=“hello,world#3”;main(){charinbuf[MSGSIZE];intp[2],j;if(pipe(p)==-1){perror(“pipecall”);exit(1);}10write(p[1],msg1,MSGSIZE);write(p[1],msg2,MSGSIZ

7、E);write(p[1],msg3,MSGSIZE);for(j=0;j<3;j++){read(p[0],inbuf,MSGSIZE);printf(“%s”,inbuf);}exit(0);}11父子进程间管道通信12管道和exec函数intmain(){intdata_processed;intfile_pipes[2];constcharsome_data[]="123";charbuffer[BUFSIZ+1];pid_tfork_result;memset(buffer,'',sizeof(buffer));if(pipe(file_pipes)==0

8、){fork_result=fork();if(fork_result==(pid_t)-1){fprintf(stderr,"Forkfailure");exit(EXIT_FAILURE);}if(fork_result==0){sprintf(buffer,"%d",file_pipes[0]);(void)execl("pipe4","pipe4",buffer,(char*)0);exit(EXIT_FAILURE);}else{data_processed=write(file_pipes[1],som

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。