一、
实现进程间通信最简单的方式就是通过管道机制来实现,管道是一种最基本的IPC机制,由pipe函数创建。pipe所创建的管道实际上是在内核中开辟一块缓冲区,它有一个独端和写段,通过read和write来实现往管道里写和读,由于管道是通过父进程调用pipe函数所产生的管道,所以和它通信的只能是它的子进程或者和它有血缘关系的进程。后面一会具体讲。先通过图示来看看管道是怎么来实现通信的
通信机制:
1、父进程先通过调用pipe函数创建一个管道。父进程的文件描述符读和写分别指向管道的两端。
2、父进程通过调用fork函数来创建子进程,然后子进程的文件描述符的读和写也分别指向管道的两端。
3、父进程关闭自己的读端,子进程关闭自己的写端。然后父进程往管道里写东西,子进程从管道里读东西,以此来实现父子进程之间的通信。
管道的特点:
1、管道只能进行单向通道。f[0]为读,f[1]为写。
2、只有具有血缘关系的两个进程才能用管道来通信。
3、管道是面向数据流的服务。
4、管道的生命周期随进程。
5、同步与互斥
先来看看父进程如何通过代码来创建管道,并且和子进程连接上的。
#include <stdlib.h>
#include<stdio.h>
#include <unistd.h>
#include <string.h>
#include <error.h>
int main()
{
int _pipe[2];
int ret = pipe(_pipe);
if(ret == -1)
{
perror("errno");
return 1;
}
pid_t id = fork();
if(id < 0)
{
perror("errno");
return 2;
}
else if(id == 0)
{//child
close(_pipe[0]);
int i = 0;
char *msg = NULL;
while(i<100)
{
msg = "hello pipe! i am child!\n";
write(_pipe[1],msg,strlen(msg));
sleep(1);
printf("pipe count %d\n",i++);
}
exit(0);
}
else{//father
close(_pipe[1]);
char _msg[100];
int i = 0;
while(i<100){
int ret = read(_pipe[0],_msg,sizeof(_msg));
printf("%scode is:%d\n",_msg,ret);
}
}
return 0;
}
这个管道里子进程先