有名管道实例

2019-07-13 07:51发布

代码来自:嵌入式linux应用开发标准教程 有名管道可以在两个没有亲缘关系的进程间通信,其实就是创建了个文件你写我读而已,加了先进先出机制 但是他是半双工的  一次只能进程A发进程B收      或者进程B发进程A收 它是严格执行先进先出的  写的永远在文件尾 读的时候永远是文件头的一个数据,且不支持leek操作 用mkfifo建立fifo后就可以用open read write  close操作fifo了 下面是一个测试程序
fifo read程序执行后建立管道并一直读fifo      fifo  write程序让用户输入字符然后写入fifo
/* fifo_read.c */ #include #include #include #include #include #include #include #include #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 "); exit(1); } } /* 打开fifo并一直读*/ fd = open(MYFIFO, O_RDONLY); if (fd == -1) { printf("Open fifo file error "); exit(1); } while (1) { memset(buff, 0, sizeof(buff)); if ((nread = read(fd, buff, MAX_BUFFER_SIZE)) > 0) { printf("Read '%s' from FIFO ", buff); } } close(fd); exit(0); }
/* fifo_write.c */ #include #include #include #include #include #include #include #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 "); exit(1); } sscanf(argv[1], "%s", buff); /* 打开fifo管道文件*/ fd = open(MYFIFO, O_WRONLY); if (fd == -1) { printf("Open fifo file error "); exit(1); } /*将用户输入的参数写入fifo*/ if ((nwrite = write(fd, buff, MAX_BUFFER_SIZE)) > 0) { printf("Write '%s' to FIFO ", buff); } close(fd); exit(0); }
下面是makefile 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程序