资源描述:
《Linux下的进程间通信课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Linux下的进程间通信:管道管道管道逻辑上是管道文件;物理上是文件系统的高速缓冲;Shell管道:cmd1
2、cmd2进程中(创建)的管道:进程之间传递数据管道接口-popenpopen:在进程中创建新进程运行另外的程序;原函:#includeFILE*popen(constchar*com,constchar*p_m);intpclose(FILE*f);p_m为‘r’,’w’分别表示调用程序读取被调用程序的输出以及调用程序向被调用程序写数据(被调用程序从标准输入设备读取这些数据,被调用程序感知不到(进程和标准设备)区别);popenpopen调用f
3、ork创建子进程,然后调用/bin/sh–c执行com命令.参数p_m可以是‘r’(代表读取)或者‘w’(代表写入).popen依p_m不同值建立管道连接到子进程的标准输出设备或标准输入设备.所有使用文件指针(FILE*)操作的函数也都可以使用这种连接.成功返回FILE指针,失败返回NULL,错误原因在errno中;因为返回的是FILE指针,所以需要使用fread/fwrite函数进行读写;pclosepclose:当popen启动的进程结束时,pclose关闭与之关联的文件流;原函:#includeintpclose(FILE*f);pclose的形
4、参就是popen返回的FILE指针;返回调用进程的退出码;popen/pclose实例1-读#include#include#include#includeintmain(){FILE*read_fp;charbuffer[BUFSIZ+1];intchars_read;memset(buffer,’ ’,sizeof(buffer));read_fp=popen("ls-l","r");将ls–l命令的标准输出作为当前进程的输入文件流FILEBUFSIZ在stdio.h中定义popen1.
5、cif(read_fp!=NULL){chars_read=fread(buffer,sizeof(char),BUFSIZ,read_fp);if(chars_read>0){printf("Outputwas:-%s",buffer);}pclose(read_fp);exit(EXIT_SUCCESS);}exit(EXIT_FAILURE);}-rwxrwxrwx1gyhgyh365Feb2215:45client.h-rwxrwxrwx1gyhgyh240Feb2215:45fifo1.c-rwxrwxrwx1gyhgyh1663Feb2215:45f
6、ifo2.c-rwxrwxrwx1gyhgyh1237Feb2215:45fifo3.c-rwxrwxrwx1gyhgyh899Feb2215:45fifo4.-rwxrwxrwx1gyhgyh268Feb2215:45…EXIT_SUCCESS,EXIT_FAILURE在stdlib.h中定义popen/pclose实例2-写已知’od-c’命令是八进制输出ASCII码或者’’转义字符.如”Onceuponatime,therewas…”经过od–c处理之后的效果如下:0000000Onceuponatime0000020,therewas...000003
7、7试将该字符串利用popen与’od-c’命令对其进行处理将输出送往popen#include#include#includeintmain(){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(
8、write_fp);exit(EXIT_SUCCESS);}exit(EXIT_FAILURE);}0000000Onceuponatime0000020,therewas...0000037结果popen2.c多数据传送实例#include#include#include#includeintmain(){FILE*read_fp;charbuffer[BUFSIZ+1];intchars_read;memset(buffer,' ',sizeof(bu