unix管道(|)是否将流程的输出流水线化为另一个流水线,而我们使用"pipe(int pipefd [2])"创建的流水线在c中用于进程间通信是否相同?
它们并不完全相同,因为调用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);
}
}
Run Code Online (Sandbox Code Playgroud)
这相当于做
cat file | grep search_word
Run Code Online (Sandbox Code Playgroud)
在壳上.