首页 > 代码库 > 【APUE】进程间通信之管道

【APUE】进程间通信之管道

管道是UNIX系统IPC最古老形式,并且所有UNIX系统都提供此种通信机制。管道由下面两种局限性:

1)历史上,它们是半双工的(即数据只能在一个方向上流动)

2)它们只能在具有公共祖先的进程之间使用。通常,一个管道由一个进程创建,然后该进程调用fork,此后父、子进程之间就可应用该管道

管道由调用pipe函数创建:

#include <unistd.h>

int pipe(int filedes[2]);//若成功则返回0,出错返回-1

注意:filedes[0]为读而打开,filedes[1]为写而打开,filedes[1]的输出是fileds[0]的输入

单个进程中的管道几乎没有任何作用。通常,调用pipe的进程接着调用fork,这样就创建了从父进程到子进程(或反向)的IPC通道。

调用fork后做什么取决于我们想要有的数据流的方向。对于从父进程到子进程的管道,父进程关闭管道的读端(fd[0]),子进程则关闭写端(fd[1]).

#include <stdlib.h>#include <stdio.h>#include <unistd.h>#define MAXLINE 100//经由管道父进程向子进程传送数据int main(){        int n;        int fd[2];        pid_t pid;        char line[MAXLINE];        if(pipe(fd)<0)                printf("pipe error");        if((pid=fork())<0)                printf("fork error");        else if(pid>0)        {                close(fd[0]);                write(fd[1],"hello world\n",12);        }        else        {                close(fd[1]);                n=read(fd[0],line,MAXLINE);                write(STDOUT_FILENO,line,n);        }        exit(0);}