进程间通信 之 管道

一 无名管道:

特点: 具有亲缘关系的进程间通信,但不只指父子进程之间哦。

(1)无名管道的创建

int pipe(int pipefd
參数:
pipefd  数组的首地址 
返回值:
成功返回0,失败返回-1 
注意:
无名管道存在内核空间。创建成功会给用户空间两个文件描写叙述符,fd[0]:读管道 fd[1]:写管道

思考:为什么无名管道仅仅能用于亲缘关系间进程通信?
由于仅仅有具有亲缘关系的进程存在数据拷贝 [复制文件描写叙述符]

二。有名管道

特点:
(1)随意进程间通信 
(2)文件系统中存在文件名称

<1>创建有名管道文件 
int mkfifo(const char *pathname, mode_t mode);
參数:
@pathname  文件名称 
@mode      指定的权限 

返回值:
成功返回0,失败返回-1 

<2>打开有名管道文件
open 

注意:
一个进程以仅仅读方式打开管道文件。则堵塞,直到还有一个进程以写的方式打开管道文件 
一个进程以仅仅写方式打开管道文件。则堵塞,直到还有一个进程以读的方式打开管道文件 

<3>读写管道 
read / write 


以下加上一个管道之间通信的样例:

负责从管道中读

<pre name="code" class="cpp"> <pre name="code" class="cpp">#include <head.h>

int read_fifo(int fd)
{
	int n;
	char buf[1024];
	
	while(1)
	{
		n = read(fd,buf,sizeof(buf) - 1);
		buf[n] = '\0';

		printf("Read %d bytes : %s\n",n,buf);

		if(strncmp(buf,"quit",4) == 0)
			break;
	}

	return 0;
}

//./a.out  fifoname
int main(int argc, const char *argv[])
{
	int fd;

	if(argc < 2)
	{
		fprintf(stderr,"Usage : %s argv[1]\n",argv[0]);
		exit(EXIT_FAILURE);
	}

	//创建有名管道 
	if(mkfifo(argv[1],0666) < 0 && errno != EEXIST)
	{
		fprintf(stderr,"Fail to mkfifo %s : %s\n",argv[1],strerror(errno));
		exit(EXIT_FAILURE);
	}

	fd = open(argv[1],O_RDONLY);
	if(fd < 0){
		fprintf(stderr,"Fail to %s : %s\n",argv[1],strerror(errno));
		exit(EXIT_FAILURE);
	}
	
	printf("Open success for read!\n");
	
	read_fifo(fd);

	return 0;
}



负责向管道中写

#include <head.h>

int write_fifo(int fd)
{
	char buf[1024];
	
	while(1)
	{
		printf("input >");
		fgets(buf,sizeof(buf),stdin);
		buf[strlen(buf) - 1] = '\0';

		write(fd,buf,strlen(buf));
		if(strncmp(buf,"quit",4) == 0)
			break;
	}
	return 0;
}

//./a.out  fifoname
int main(int argc, const char *argv[])
{
	int fd;

	if(argc < 2)
	{
		fprintf(stderr,"Usage : %s argv[1]\n",argv[0]);
		exit(EXIT_FAILURE);
	}

	//创建有名管道 
	if(mkfifo(argv[1],0666) < 0 && errno != EEXIST)
	{
		fprintf(stderr,"Fail to mkfifo %s : %s\n",argv[1],strerror(errno));
		exit(EXIT_FAILURE);
	}

	fd = open(argv[1],O_WRONLY);
	if(fd < 0){
		fprintf(stderr,"Fail to %s : %s\n",argv[1],strerror(errno));
		exit(EXIT_FAILURE);
	}
	write_fifo(fd);
	
	return 0;
}


posted @ 2015-12-27 13:27  mengfanrong  阅读(171)  评论(0编辑  收藏  举报