我正在查看c ++程序的代码,该程序将文件的内容管道更多。我不太明白它,所以我想知道是否有人可以为一个c ++程序编写伪代码来管理其他东西?为什么有必要使用fork?
答案 0 :(得分:6)
create pipe
fork process
if child:
connect pipe to stdin
exec more
write to pipe
您需要fork()
,以便在调用之前替换孩子的stdin,这样您就不必在继续之前等待该过程。
答案 1 :(得分:2)
您将准确找到答案here
答案 2 :(得分:2)
为什么有必要使用fork?
从shell运行管道时,例如
$ ls | more
会发生什么? shell运行两个进程(一个用于ls
,一个用于more
)。此外,ls
的输出(STDOUT)通过管道连接到more
的输入(STDIN)。
请注意,ls
和more
不需要知道任何有关管道的信息,它们只是分别写入(和读取)它们的STDOUT(和STDIN)。此外,因为它们可能会执行正常的阻塞读写操作,所以它们可以同时运行。否则ls
可以填充管道缓冲区并在more
有机会消耗任何东西之前永久阻止。
......把东西送到其他东西......
另请注意,除了并发参数之外,如果其他是另一个程序(如more
),则必须在另一个进程中运行。您可以使用fork
创建此流程。如果您只是在当前进程中运行more
(使用exec
),它将替换您的程序。
一般情况下,可以使用不带fork
的管道,但您只需在自己的流程中进行通信。这意味着您要么进行非阻塞操作(可能在同步协同例程设置中),要么使用多个线程。