Linux进程通信——管道

管道(pipe)本质上是一种文件,管道通信本质上是通过读写文件通信,但是管道解决了文件的两个问题:限制管道大小,解决read()调用文件结束问题。

管道一个环形的缓冲区,通过两个进程以生产者/消费者的模型进行通信,是一个先进先出队列,一个进程写一个进程读。Linux内核通过锁、等待队列和信号等机制同步对管道的访问。

Linux管道分为管道(Pipe)和有名管道(named pipe或FIFO):管道可用于具有亲缘关系进程间的通信,有名管道还允许无亲缘关系进程间的通信。

关键字:半双工、队列、特殊文件

#include <unistd.h> 
#include <sys/types.h> 
#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char*argv[]) 
{  
	int pipe_fd[2];
	pid_t pid;
	char r_buf[100];
	char w_buf[4];
	char* p_wbuf; 
	int r_num;  
	int cmd;   
	memset(r_buf,0,sizeof(r_buf));  
	memset(w_buf,0,sizeof(w_buf));
	
	p_wbuf = w_buf;  
	if (pipe(pipe_fd) < 0)
	{   
		printf("pipe create error\n");   
		return -1;   
	}
	
	if ((pid = fork()) == 0) 
	{   
		printf("\n");   
		close(pipe_fd[1]);
		sleep(3);//确保父进程关闭写端       
		r_num = read(pipe_fd[0], r_buf, 100);  
		printf("read num is %d the data read from the pipe is %d\n", r_num, atoi(r_buf));
		close(pipe_fd[0]);
		exit(0); 
	}   
	else if (pid > 0)  
	{   
		close(pipe_fd[0]);//read  
		strcpy(w_buf,"111");   
		if(write(pipe_fd[1],w_buf,4)!=-1)
		{			
			printf("parent write over\n");  
		}
		close(pipe_fd[1]);//write    
		printf("parent close fd[1] over\n");   
		sleep(10);  
	}   
} 

posted @ 2016-12-13 22:16  Chan-j  阅读(249)  评论(0编辑  收藏  举报