将一个进程的输出管道传输到另一个进程上的unix管道(|)和我们在c中使用"pipe(int pipefd[2])"创建的用于进程间通信的管道是否相同?
外壳管道|
是使用pipe(2)
和dup2(2)
系统调用实现的。
请参阅Unix管道。
它们并不完全相同,因为调用pipe(2)
不足以实现shell的|
的等效函数。
pipe(2)
创建两个文件描述符(读取端和写入端)。但要实现|
功能,您还需要做更多的工作。
创建管道的典型顺序如下:
1) 使用pipe(2)
创建一个读端和一个写端。
2) 使用fork()
创建一个子进程。
3) 父进程和子进程使用dup2()
复制文件描述符。
4) 两个进程,每个进程都关闭管道的一端(每个进程不使用的管道的一端)。
5) 一个写入管道,另一个从管道读取。
考虑一个简单的例子来证明这一点。在这个例子中,您传递一个文件名作为参数,父进程"greps"子进程的cat
文件。
#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv)
{
int pipefd[2];
int pid;
char *cat_args[] = {"cat", argv[1], NULL};
char *grep_args[] = {"grep", "search_word", NULL};
pipe(pipefd);
pid = fork();
if (pid != 0)
{
dup2(pipefd[0], 0);
close(pipefd[1]);
execvp("grep", grep_args);
}
else
{
dup2(pipefd[1], 1);
close(pipefd[0]);
execvp("cat", cat_args);
}
}
这相当于做
cat file | grep search_word
在外壳上。
外壳使用pipe(2)
系统调用与|
操作员进行管道连接
|
是shell的实现,它有意使用pipe()
系统调用。