我们使用"pipe(int pipefd [2])"在c中创建的unix管道(|)和管道是否相同?

Ps *_*hay 8 c unix pipe

unix管道(|)是否将流程的输出流水线化为另一个流水线,而我们使用"pipe(int pipefd [2])"创建的流水线在c中用于进程间通信是否相同?

fal*_*tru 6

Shell管道|使用pipe(2)dup2(2)系统调用实现.

请参阅Unix管道.


P.P*_*.P. 5

它们并不完全相同,因为调用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)

在壳上.