天天看点

linux中的进程间通信-管道

作者:见字如疯

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

继续阅读