有名管道可以实现互不关联的进程间的通信
1、创建有名管道
mkfifo
int mkfifo(const char *filename,mode_t mode)
filename:要创建的管道
mode:
O_RDONLY:读管道
O_WRONLY:写管道
O_RDWR:读写管道
O_NONBLOCK:非阻塞
O_CREAT:如果该文件不存在,那么就创建一个新的文件,并用第三的参数为其设置权限
O_EXCL:如果使用 O_CREAT 时文件存在,那么可返回错误消息。这一参数可测试文件是否存在
返回值:成功返回0,出错返回-1
测试代码:
#include <sys/types.h> #include <sys/stat.h> #include <errno.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define FIFO "/tmp/testfifo" main(int argc,char** argv) { char buf[100]; pid_t pid; memset(buf,0,sizeof(buf)); /*创建有名管道,并设置相应的权限*/ if((mkfifo(FIFO,O_CREAT|O_EXCL)<0)&&(errno!=EEXIST)) printf("cannot create fifoserver\n"); if((pid = fork()) == 0) { /*子进程读*/ int fd; fd = open(FIFO,O_RDONLY); if(fd < 0) { printf("open error\n"); exit(-1); } while(1) { read(fd, buf, sizeof(buf)); printf("read :%s\n",buf); sleep(1); } close(fd); } else if(pid > 0) { /*父进程写*/ int fd; fd = open(FIFO,O_WRONLY); if(fd < 0) { printf("open error\n"); exit(-1); } while(1) { printf("please input strings\n"); fgets(buf, sizeof(buf), stdin); write(fd, buf, strlen(buf)); printf("write :%s\n",buf); sleep(1); } close(fd); } else { printf("fork error\n"); exit(-1); } unlink(FIFO); return 0; }
please input strings helloworld read :helloworld write :helloworld please input strings