unix管道(|)是否将流程的输出流水线化为另一个流水线,而我们使用"pipe(int pipefd [2])"创建的流水线在c中用于进程间通信是否相同?
Shell管道|
使用pipe(2)
和dup2(2)
系统调用实现.
请参阅Unix管道.
它们并不完全相同,因为调用pipe(2)
不足以实现shell的等效功能|
.
pipe(2)
创建两个文件描述符(读取结束和写入结束).但是你需要做的不仅仅是实现|
功能.
创建管道的典型顺序如下:
1)使用创建读端和写端pipe(2)
.
2)使用创建子进程fork()
.
3)父子进程使用复制文件描述符dup2()
.
4)两个过程,每个过程都关闭管道的一端(每个过程不使用的管道的一端).
5)一个写入管道和管道中的其他读取.
考虑简单的例子来证明这一点.在这里你传递一个文件名作为参数,父进程"greps" cat
由孩子的文件.
#include#include 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
在壳上.