#有名管道之间的通信
//1. 创建有名管道
//2. 本进程执行循环等待数据被写入到管道中并读有名管道
//3. 打开有名管道并写数据到名管道
//create_fifo.c
#include <stdio.h> #include <stdlib.h> #include <sys/stat.h> #include <string.h> #include <errno.h> int main(int argc,char **argv) { if(argc<2) { fprintf(stdout,"Usage:%s<filename>\n",argv[0]); exit(-1); } if(mkfifo(argv[1],0644)<0) { fprintf(stderr,"mkfifo()failed:%s\n",strerror(errno)); exit(-1); } return 0; }
//xieguandao.c
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> #include <errno.h> #define BUFFER_SIZE 1024 int main(int argc,char **argv) { int fd; if(argc<2) { fprintf(stdout,"Usage:%s<filename>\n",argv[0]); exit(-1); } if((fd=open(argv[1],O_WRONLY))<0) { fprintf(stderr,"open fifo %s for writtinng failed:%s\n",argv[1],strerror(errno)); exit(-1); } fprintf(stdout,"open fifo %s for writting successed.\n",argv[0]); char buffer[BUFFER_SIZE]; ssize_t n; while(fgets(buffer,BUFFER_SIZE,stdin)) { if((n=write(fd,buffer,strlen(buffer)+1))<0) { fprintf(stderr,"write()failed on fifo:%s\n",strerror(errno)); break; } } return 0; }
//duguandao.c
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> #include <errno.h> #define BUFFER_SIZE 1024 int main(int argc,char **argv) { int fd; if(argc<2) { fprintf(stdout,"Usage:%s<filename>\n",argv[0]); exit(-1); } if((fd=open(argv[1],O_RDONLY))<0) { fprintf(stdout,"open fifo %s for reading failed:%s\n",argv[1],strerror(errno)); exit(-1); } fprintf(stdout,"open fifo %s reading successed.\n",argv[0]); char buffer[BUFFER_SIZE]; ssize_t n; while(1) { if((n=read(fd,buffer,BUFFER_SIZE))<0) { fprintf(stderr,"read failed on %s:%s\n",argv[1],strerror(errno)); exit(-1); } else if(n==0) { fprintf(stderr,"peer closed fifo.\n"); break; } else { fprintf(stdout,"%s\n",buffer); } } return 0; }