【发布时间】:2011-08-15 22:56:04
【问题描述】:
我正在查看一个 c++ 程序的代码,该程序将文件的内容通过管道传输到更多文件。我不太明白,所以我想知道是否有人可以为 c++ 程序编写伪代码,将某些东西传递给其他东西?为什么一定要用fork?
【问题讨论】:
-
您必须使用 fork,因为管道是一种并行化程序的形式,如果您不使用 fork,它将无法正常工作。
标签: c++ pipe pseudocode
我正在查看一个 c++ 程序的代码,该程序将文件的内容通过管道传输到更多文件。我不太明白,所以我想知道是否有人可以为 c++ 程序编写伪代码,将某些东西传递给其他东西?为什么一定要用fork?
【问题讨论】:
标签: c++ pipe pseudocode
create pipe
fork process
if child:
connect pipe to stdin
exec more
write to pipe
你需要fork(),这样你就可以在调用之前替换孩子的stdin,这样你就不用等待进程再继续。
【讨论】:
你会准确找到答案here
【讨论】:
为什么要使用fork?
当您从 shell 运行管道时,例如。
$ ls | more
会发生什么? shell 运行两个进程(一个用于ls,一个用于more)。此外,ls 的输出(STDOUT)通过管道连接到more 的输入(STDIN)。
请注意,ls 和 more 不需要了解有关管道的任何信息,它们只需分别写入(和读取)它们的 STDOUT(和 STDIN)。此外,由于它们可能会进行正常的阻塞读取和写入,因此它们可以同时运行是必不可少的。否则ls 可能会在more 有机会消耗任何东西之前填充管道缓冲区并永远阻塞。
...通过管道将某些东西传递给其他东西...
还要注意,除了并发参数之外,如果您的 something else 是另一个程序(如more),它必须在另一个进程中运行。您使用fork 创建此进程。如果您只是在当前进程中运行more(使用exec),它将替换您的程序。
一般来说,您可以使用没有fork 的管道,但您只是在自己的进程中进行通信。这意味着您要么执行非阻塞操作(可能在同步协同程序设置中),要么使用多个线程。
【讨论】: