是unix管道(|)和我们使用“创建”创建的管道;管道(int pipefd[2])”;在c语言中是一样的吗?

是unix管道(|)和我们使用“创建”创建的管道;管道(int pipefd[2])”;在c语言中是一样的吗?,c,unix,pipe,C,Unix,Pipe,unix管道(|)将一个进程的输出管道化到另一个进程,我们在c中使用“管道(int pipefd[2])创建的管道用于进程间通信吗?Shell管道|是使用管道(2)和dup2(2)系统调用实现的 请参阅。Shell使用管道(2)系统调用与|操作符进行管道连接 |是shell的实现,它主要使用pipe()syscall 在调用管道(2)不足以实现shell的|的等效功能的意义上,它们并不完全相同 创建两个文件描述符(读端和写端)。但要实现|功能,您需要做的还不止这些 创建管道的典型顺序如下所示:

unix管道(|)将一个进程的输出管道化到另一个进程,我们在c中使用“管道(int pipefd[2])创建的管道用于进程间通信吗?Shell管道
|
是使用
管道(2)
dup2(2)
系统调用实现的

请参阅。

Shell使用
管道(2)
系统调用与
|
操作符进行管道连接


|
是shell的实现,它主要使用
pipe()
syscall

在调用
管道(2)
不足以实现shell的
|
的等效功能的意义上,它们并不完全相同

创建两个文件描述符(读端和写端)。但要实现
|
功能,您需要做的还不止这些

创建管道的典型顺序如下所示:

1) 使用
管道(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);
    }
}

在外壳上。

为什么要创建副本?我们不能在不进行复制的情况下写入和读取数据吗?在所有的父子进程通信中,这并不是严格必需的(
dup2()
)。你的父母和孩子也可以直接沟通。例如,父级可以
将(2)
写入管道的写入端,子级可以
从读取端读取(2)
。@PsAkshay因为执行的grep和cat只从0和1读取/写入,而不是从管道fd读取/写入。
cat file | grep search_word