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

时间:2015-12-14 13:37:33

标签: c unix pipe

管道输出流程的unix管道(|)和我们使用“pipe(int pipefd [2])”创建的管道在c中用于进程间通信吗?

3 个答案:

答案 0 :(得分:6)

Shell管道mkdosfs: unable to create floppy.img是使用|pipe(2)系统调用实现的。

请参阅Unix Pipes

答案 1 :(得分: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);
    }
}

这相当于做

cat file | grep search_word 

在shell上。

答案 2 :(得分:0)

shell使用pipe(2)系统调用来与|运算符

进行管道连接

|是shell的实现,它特意使用pipe()系统调用。