代码来自:嵌入式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);
}
下面是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程序