Linux进程间通信---管道通信

1.进程间通信的目的:

   1.数据传输  2.共享数据  3.通知事件  4.资源共享  5.进程控制

2.进程间通信的方法:

   1.管道(Pipe)和有名管道(FIFO)

   2.信号(Signal)

   3.消息队列

   4.共享内存(Shared Memory)

   5.信号量(Semaphore)

   6.套接字(Socket)

(1)管道通信:管道是半双工的,数据只能向一个方向流动,需要双方通信时需要建立两个管道。

                           只能用在具有亲缘关系的进程之间(有名管道不受限制)。

                           单独构成一种独立的文件系统。

                          数据的写入和读出:一个进程向管道的一端写入内容,被另一个进程在管道的另外一端读出。写入的内容每次都                            添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。 

                           pipe(); 函数用来建立无名管道。

   

下面是父子进程双向通信的示例代码,需要注意的是要创建两个管道。 

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

int main()
{
	pid_t pid;
	int i;
	int fd[2];
	char buf[100];
	
	
	//一定要在创建子进程之前创建管道,否则子进程也会创建不需要的管道。
	if(pipe(fd) < 0)	
	{
		printf("pipe error\n");
		exit(0);
	}
	printf("fd[0] = %d,  fd[1] = %d \n", fd[0], fd[1]);
	pid = fork();    //创建子进程

	if(pid < 0)
	{
		printf("FORK ERROR\n");
		exit(1);
	}

    else if(pid > 0)    //父进程
	{
		close (fd[0]);    //关闭读取端
        char s[] = {"hello . . . \n"};
		write(fd[1], s, sizeof(s));
		sleep(1);
		close (fd[1]);    //关闭写入端
		
		wait(NULL);
	}
	else                 //子进程
	{
		close (fd[1]);
	    
		
		read(fd[0], buf, sizeof(buf));
		
		printf("I am a child!\n");	
		
		printf("%s", buf);
		close (fd[0]);
		exit(0);
		
	}
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/zwt0112/article/details/81348467