进程间通信-管道

来源:互联网 发布:万科金域名城怎么样 编辑:程序博客网 时间:2024/05/27 14:14

上一节讲到Unix只能通过fork这个系统调用创建进程,子进程获得父进程的数据空间、堆和栈的副本,但并不共享这部分存储空间。父、子进程之间交换信息的唯一途径就是传送打开的文件。
本节介绍进程之间相互通信的其他技术——进程间通信(IPC)。

管道

管道是Unix系统IPC最古老的形式,所有的Unix系统都提供这种通信机制。管道有以下2中局限性:
(1)历史上,它们是半双工的(即数据只能在一个方向上流动)。
(2)管道只能在具有公共祖先的两个进程间使用。

管道是通过pipe函数创建的

#include<unistd.h>int pipe(int fd[2]);返回值:若成功,返回0,若出错,返回-1

经由参数fd返回2个文件描述符,fd[0]为读而打开,fd[1]为写而打开。fd[1]的输出是fd[0]的输入。

单个进程的管道几乎没有任何用处。通常,进程会先调用pipe,接着调用fork,从而创建从父进程到子进程的IPC通道,反之亦然。

下面这个程序演示了pipe的用法

首先创建了从父进程到子进程的管道,并且父进程经由该管道向子进程传送数据。

#include<unistd.h>#include<stdio.h>#include<sys/wait.h>#include<errno.h>#include<stdlib.h>#include<string.h>#include<fcntl.h>#define MAXLEN 1024int main(){    int n;    int fd[2];    pid_t pid;    char buf[MAXLEN];    if(pipe(fd)<0)    {        fprintf(stderr,"pipe error:[%s]\n",strerror(errno));        exit(1);    }    if((pid=fork())<0)    {        fprintf(stderr,"fork error:[%s]\n",strerror(errno));        exit(1);    }    else if(pid>0)    {        close(fd[0]);        write(fd[1],"hello world\n",12);    }    else    {        close(fd[1]);        n=read(fd[0],buf,MAXLEN);        write(STDOUT_FILENO,buf,n);    }    exit(0);}
原创粉丝点击