有名管道实例

代码来自:嵌入式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程序

有名管道实例_第1张图片



你可能感兴趣的:(有名管道实例)