进程通信之管道通信
编写两个程序,一个程序是对管道的写数据、另一个是对管道的读数据。
有名管道的创建mkfifo
读数据:fifo_read.c
/* fifo_read.c */ #include <sys/types.h> #include <sys/stat.h> #include <errno.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <limits.h> #define MYFIFO "/tmp/myfifo" /* 有名管道文件名 */ #define MAX_BUFFER_SIZE PIPE_BUF /* 定义在limits.h中 */ int main() { char buff[MAX_BUFFER_SIZE]; int fd; int nread; /* 判断有名管道是否已存在,若尚未创建,则以相应的权限创建 */ if(access(MYFIFO, F_OK) == -1) { if((mkfifo(MYFIFO, 0666) < 0) && (errno != EEXIST)) { printf("Cannot create fifo file\n"); exit(1); } } /* 以只读阻塞方式打开有名管道 */ fd = open(MYFIFO, O_RDONLY); if(fd == -1) { printf("Open fifo file error\n"); exit(1); } while(1) { memset(buff, 0, sizeof(buff)); if((nread = read(fd, buff, MAX_BUFFER_SIZE)) > 0) { printf("Read '%s' from FIFO\n",buff); } } close(fd); exit(0); }
写数据:
/* fifo_write.c */ #include <sys/types.h> #include <sys/stat.h> #include <errno.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <limits.h> #define MYFIFO "/tmp/myfifo" /* 有名管道文件名 */ #define MAX_BUFFER_SIZE PIPE_BUF /* 定义在limits.h中 */ int main(int argc, char* argv[]) /* 参数为即将写入的字符串 */ { int fd; char buff[MAX_BUFFER_SIZE]; int nwrite; if(argc <= 1) { printf("Usage: ./fifo_write string\n"); exit(1); } sscanf(argv[1], "%s", buff); /* 以只写阻塞方式打开FIFO管道 */ fd = open(MYFIFO, O_WRONLY); if(fd == -1) { printf("Open fifo file error\n"); exit(1); } /* 向管道中写入字符串 */ if((nwrite = write(fd, buff, MAX_BUFFER_SIZE)) > 0) { printf("Write '%s' to FIFO\n",buff); } close(fd); return 0; }