代码来自:嵌入式linux应用开发标准教程
有名管道可以在两个没有亲缘关系的进程间通信,其实就是创建了个文件你写我读而已,加了先进先出机制
但是他是半双工的 一次只能进程A发进程B收 或者进程B发进程A收
它是严格执行先进先出的 写的永远在文件尾 读的时候永远是文件头的一个数据,且不支持leek操作
用mkfifo建立fifo后就可以用open read write close操作fifo了
下面是一个测试程序
fifo read程序执行后建立管道并一直读fifo
fifo write程序让用户输入字符然后写入fifo
/* fifo_read.c */ #include <sys/types.h> #include <sys/stat.h> #include <errno.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.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; /* 不存在则创建fifo*/ if (access(MYFIFO, F_OK) == -1) { if ((mkfifo(MYFIFO, 0666) < 0) && (errno != EEXIST)) { printf("Cannot create fifo file\n"); exit(1); } } /* 打开fifo并一直读*/ 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" /* 共享的fifo文件*/ #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); } /*将用户输入的参数写入fifo*/ if ((nwrite = write(fd, buff, MAX_BUFFER_SIZE)) > 0) { printf("Write '%s' to FIFO\n", buff); } close(fd); exit(0); }
EXEC_WR = fifo_write OBJS_WR = fifo_write.o EXEC_RD = fifo_read OBJS_RD = fifo_read.o HEADERS = CC = gcc INC = -I. CFLAGS = ${INC} -g all:${EXEC_WR} ${EXEC_RD} ${EXEC_WR} : ${OBJS_WR} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ ${OBJS_WR} ${OBJS_WR} : ${HEADERS} ${EXEC_RD} : ${OBJS_RD} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ ${OBJS_RD} ${OBJS_RD} : ${HEADERS} .PHONY : clean clean : -rm -f ${OBJS_WR} ${EXEC_WR} -rm -f ${OBJS_RD} ${EXEC_RD}
1,make 生成 fifo_read fifo_write 两个可执行文件
2,打开一个终端 ./fifo_read 创建管道文件并一直读
3打开另一个终端 ./fifo_write 参数 参数就是要写入fifo 发给fifo read程序的
结果从fifo write得到的用户输入 都传给了 fifo read程序