linux进程通信(命名管道)
管道应用的一个重大限制就是它没有名字,因此,只能用于具有亲缘关系的进程间的通信,在有名管道(Named Pipe或 FIFO)提出后,该限制得到了克服,FIFO不同于管道之处
在于它提供了一个路径名与之关联,以FIFO的文件形式存在与文件系统中。这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,彼此之间就能进行通信
一个比较好的命名管道例子:
下面这个例子使用FIFO进行进程间的通信,程序lucy.c创建了FIFO write_fifo用于向程序peter.c发送消息;peter.c程序创建了FIFO read_fifo用于向lucy.c发送消息
同时,lucy.c能够通过打开peter.c创建的FIFO来得到的peter.c发来的消息,peter.c能够通过打开lucy.c创建的FIFO来得到lucy.c发来的消息。因此两者就能互相通信了,两者必须在线才能进行通信聊天,这个有点类似qq的聊天功能。
下面是源程序lucy.c
#include<sys/types.h>#include<sys/stat.h>#include<string.h>#include<stdio.h>#include<errno.h>#include<fcntl.h>int main(void){ char write_fifo_name[]= "read-fifo"; char read_fifo_name[]= "write-fifo"; int write_fd,read_fd;char buf[256]; int len; int ret=mkfifo(write_fifo_name,S_IRUSR | S_IWUSR); if(ret==-1) { printf("Fail to create FIFO %s",write_fifo_name,strerror(errno)); exit(-1);} while((read_fd=open(read_fifo_name,O_RDONLY))==-1) { sleep(1);} write_fd=open(write_fifo_name,O_WRONLY);if(write_fd==-1) {printf("Fail to open FIFO %s: %s",write_fifo_name,strerror(errno));exit(-1);}while(1) {len=read(read_fd,buf,256);if(len>0) {buf[len]='\0';printf("熊尧: %s\n",buf);}printf("红刚:");fgets(buf,256,stdin);buf[strlen(buf)-1]='\0';if(strncmp(buf,"quit",4)==0) {close(write_fd);unlink(write_fifo_name);close(read_fd);exit(0);}write(write_fd,buf,strlen(buf));}}