l 每个进程都有各自的用户地址空间,各个进程间的全局变量相互之间都看不到,因此不同进程间通信必须经过内核,在内核开辟一块缓存区,一个进程将数据从用户空间拷贝到内核缓存区,另一个进程从内核缓存区把数据取走,这种通信机制为进程间通信。
l 管道是进程间通信的一种方法,主要用于父子进程。即通过fork()创建的父子间的通信。
l 管道的创建
#include<unistd.h>
Int pipe(int fd[2])
返回值:成功返回0,出错返回-1
Fd参数返回两个文件的描述符,fd[0]指向管道的读端,fd[1]指向管道的写道,fd[1]的输出是fd[0]的输入。
l 管道实现进程间通信
1. 父进程创建管道,得到两个文件描述符指向管道的两端;
2. 父进程fork出子进程,子进程也有两个文件描述符指向同管道;
3. 父进程关闭fd[0],子进程关闭fd[1],即子进程关闭管道的读端,父进程关闭管道的写端,(管道只支持单向通信)。子进程向管道写数据,父进程从管道读数据。管道是环形队列实现的。
l 管道特点
1. 管道只支持父子进程通信,
2. 管道只支持单向通信;
3. 管道面向字节流;
4. 管道随进程,进程在管道在,进程消失管道对应的端口关闭,两个进程都消失管道也消失。
l 管道通信代码
#include<stdio.h>
#include<string.h>
#include<errno.h>
int main()
{
int fd[2];
int pipe_id=pipe(fd);
if(pipe_id==-1)
perror("pipe error\n");
return -1;
}
pid_t id=fork();
if(id==0)
int i=0;
close(fd[0]);
char* child_fork="I am child fork!";
while(i<5)
write(fd[1],child_fork,strlen(child_fork)+1);
sleep(2);
i++;
else if(id>0)
close(fd[1]);
char msg[100];
int j=0;
while(j<5)
memset(msg,'\0',sizeof(msg));
ssize_t s=read(fd[0],msg,sizeof(msg));
if(s>0)
msg[s-1]='\0';
printf("%s\n",msg);
j++;
else
perror("fork error\n");
return 0;
l