当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《我们使用"pipe(intpipefd[2])"在c中创建的unix管道(|)和管道是否相同?》经验,为你挑选了2个好方法。

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



1> falsetru..:

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

请参阅Unix管道.



2> P.P...:

它们并不完全相同,因为调用pipe(2)不足以实现shell的等效功能|.

pipe(2)创建两个文件描述符(读取结束和写入结束).但是你需要做的不仅仅是实现|功能.

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

1)使用创建读端和写端pipe(2).

2)使用创建子进程fork().

3)父子进程使用复制文件描述符dup2().

4)两个过程,每个过程都关闭管道的一端(每个过程不使用的管道的一端).

5)一个写入管道和管道中的其他读取.

考虑简单的例子来证明这一点.在这里你传递一个文件名作为参数,父进程"greps" cat由孩子的文件.

#include 
#include 

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 

在壳上.

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有