一 Linux進程間通信( 四 )

talkB.c
#include<stdio.h>#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include<stdlib.h>#include<fcntl.h>//以只讀的方式打開管道2//以只寫的方式打開管道1#define SIZE 1024int main(){int fdr = -1;int fdw = -1;int ret = -1;char buf[SIZE];//以只寫的方式打開管道1fdw = open("fifo1",O_WRONLY);if(-1==fdw){perror("open");return 1;}printf("以只寫的方式打開管道1....\n");//以只讀的方式打開管道2fdr = open("fifo2",O_RDONLY);if(-1==fdr){perror("open");return 1;}printf("以只讀的方式打開管道2....\n");//循環讀寫while(1){//寫管道1memset(buf,0,SIZE);fgets(buf,SIZE,stdin);//去掉最后一個換行符if('\n'==buf[strlen(buf)-1])buf[strlen(buf)-1]=0;//寫管道ret = write(fdw,buf,strlen(buf));if(ret<=0){perror("write");break;}printf("write ret:%d\n",ret);//讀管道2memset(buf,0,SIZE);ret = read(fdr,buf,SIZE);if(ret<=0){perror("read");break;}printf("read:%s\n",buf);}//關閉文件描述符close(fdr);close(fdw);}運行結果如下:可以實現阻塞式的數據讀取

一 Linux進程間通信

文章插圖
當兩個進程通信的時候,我們查看fifo的大?。?
一 Linux進程間通信

文章插圖
可以發現 , 管道的大小沒有發生變化 。其實兩個進程通信是在內存中進行的,并沒有把數據寫到管道中,因為管道只是一個符號性的文件 。如果是在管道寫數據,那么IO次數會很多,效率太低了 。
【一 Linux進程間通信】

推薦閱讀