一 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进程间通信】

推荐阅读