管道pipe是UNIX系统IPC进程间通信的最古老形式,并且所有UNIX系统都提供此种通信机制。
管道有下面两种局限性:
1、历史上,管道是半双工管道,数据只能在一个方向上流动,某些系统则提供了全双工管道。
2、管道只能在具有公共祖先的进程之间使用。
半双工管道虽然有自身的局限性,但仍是最常用的IPC形式。每当你在管道线中键入一个由shell执行的命令序列时,shell为每一条命令单独创建一进程,然后将前一条命令进程的标准输出用管道与后一条命令的标准输入相连接。
#include <unistd.h>
int pipe(int pipefd[2]);
管道由pipe函数创建,参数pipefd返回两个文件描述符,pipefd[0]为读而打开,pipefd[1]为写而打开,pipefd[1]的输出是pipefd[0]的输入。
单个进程中的管道几乎没有任何用处,通常调用pipe的进程接着调用fork。对于从父进程到子进程的管道,父进程关闭管道的读端pipefd[0],子进程关闭管道的写端pipefd[1]。当读一个写端已被关闭的管道时,在所有数据都被读取后,read返回0,以指示达到了文件结束处。如果写一个读端已被关闭的管道,则产生SIGPIPE信号。在写管道时,常量PIPE_BUF规定了内核中管道缓冲区的大小,这个需要我们注意。
下面例子说明了管道的简单用法。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
int n;
int fd[2];
pid_t pid;
char line[4096];
if (pipe(fd) < 0) {
printf("pipe error\n");
return -1;
}
if ((pid = fork()) < 0) {
printf("fork error");
return -1;
}
else if (pid > 0) {
close(fd[0]);
write(fd[1], "pipe from parent\n", 17);
}
else {
close(fd[1]);
n = read(fd[0], line, 4096);
write(STDOUT_FILENO, line, n);
}
exit(0);
}
例子中,从父进程向子进程传送了数据“pipe from parent\n”,子进程又将该数据写到了标准输出。
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/ieearth/article/details/46771919