有名管道的實現

wzm10455發表於2012-12-07
無名管道和有名管道的區別就是有名管道可以實現不同的父子程式之間的通訊,而無名管道只能保證一對父子程式之間的通訊
/*
 * 有名管道.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;

}

相關文章