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



将一个进程的输出管道传输到另一个进程上的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()系统调用。

最新更新