如何在c++; 我正在看一个C++程序的代码,它把文件的内容管得更多。我不太明白,所以我想知道有没有人能编写一个C++程序的假代码,它把一些东西变成了别的东西?为什么要用叉子 create pipe fork process if child: connect pipe to stdin exec more write to pipe

如何在c++; 我正在看一个C++程序的代码,它把文件的内容管得更多。我不太明白,所以我想知道有没有人能编写一个C++程序的假代码,它把一些东西变成了别的东西?为什么要用叉子 create pipe fork process if child: connect pipe to stdin exec more write to pipe,c++,pipe,pseudocode,C++,Pipe,Pseudocode,您需要fork(),这样您就可以在调用之前替换子进程的stdin,并且不必等待进程继续。您将准确地找到答案 为什么要用叉子 create pipe fork process if child: connect pipe to stdin exec more write to pipe 当你从外壳上运行管道时,例如 $ ls | more 会发生什么?shell运行两个进程(一个用于ls,一个用于more)。此外,ls的输出(STDOUT)通过管道连接到more的输入(STDIN) 请

您需要
fork()
,这样您就可以在调用之前替换子进程的stdin,并且不必等待进程继续。

您将准确地找到答案

为什么要用叉子

create pipe
fork process
if child:
  connect pipe to stdin
  exec more
write to pipe
当你从外壳上运行管道时,例如

$ ls | more
会发生什么?shell运行两个进程(一个用于
ls
,一个用于
more
)。此外,
ls
的输出(STDOUT)通过管道连接到
more
的输入(STDIN)

请注意,
ls
more
不需要了解有关管道的任何信息,它们只需分别向其STDOUT(和STDIN)进行写入(和读取)。此外,因为它们可能执行正常的阻塞读写,所以它们必须能够并发运行。否则,
ls
可能会在
more
有机会消费任何东西之前,填满管道缓冲区并永远阻塞

。。。把某件事和另一件事联系起来

另外请注意,除了concurrency参数之外,如果您的something other是另一个程序(如
more
),则它必须在另一个进程中运行。您可以使用
fork
创建此流程。如果您只是在当前进程中运行
more
(使用
exec
),它将替换您的程序



通常,您可以使用不带
fork
的管道,但您只需要在自己的流程中进行通信。这意味着您要么在执行非阻塞操作(可能在同步协同例程设置中),要么在使用多个线程。

您必须使用fork,因为管道是程序并行化的一种形式,如果您不使用fork,它将无法正常工作。虽然这从理论上可以回答这个问题,在这里包括答案的基本部分,并提供链接供参考。