有名管道的实现

无名管道和有名管道的区别就是有名管道可以实现不同的父子进程之间的通信,而无名管道只能保证一对父子进程之间的通信
/*
 * 有名管道.c
 *读管道通讯
 *  Created on: 2012-12-7
 *      Author: wzm
 */

#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>//定义了很多宏和open可以打开欲打开的文件路径字符串,fcntl函数
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<errno.h>
#define FIFO_1 "test1"
#define FIFO_2  "test2"

int main()
{
	int fd1,fd2,len;
	int n=mkfifo(FIFO_1,0666);
	
	//测试管道1是否正确
	if(errno!=EEXIST)
	{
		puts("FEFO_1 fail");
		return 0;
	}
	//用于写
	char w_buf[1024];
	memset(w_buf,0,1024);//初始化
	//用于读
	char r_buf[1024];
	memset(r_buf,0,1024);//初始化

	pid_t pid;

	if((pid=fork())<0)//创建子进程
	{
		puts("create child fail");
	}
	//子进程用于接受
	else if(pid==0)
	{
		fd2=open(FIFO_1,O_RDONLY);
		if(fd2<0)
		{
			puts("open fail FIFO_2");
			return 0;
		}
		while(1)
		{
			n=read(fd2,r_buf,sizeof(r_buf));
			printf("get buf from cli2 =%s \n",r_buf);
			memset(r_buf,0,1024);
		}
	}
	//父进程用于发送
	else
	{
		fd1=open(FIFO_1,O_WRONLY);
		if(fd1<0)
		{
			puts("open fail FIFO_1");
			return 0;
		}
		while(1)
		{
			scanf("%s",w_buf);
			n=write(fd1,w_buf,strlen(w_buf));
			memset(w_buf,0,1024);
		}

	}
	close(fd1);
	close(fd2);
	return 0;

}

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