在C中制作基本外壳并且在管道/前叉方面存在问题

时间:2014-09-24 19:34:42

标签: c++ c unix fork pipe

首先,我想问一下管道为什么需要叉子?我对此很新,但对我来说,我还不明白为什么我不能只在一个左边运行一个进程。然后让下一部分继续使用结果作为输入。我知道叉子已被使用,但我不知道为什么或需要它们。

非常感谢你回答这个问题,尽管这可能是一个愚蠢的问题。

2 个答案:

答案 0 :(得分:1)

阅读Advanced Linux Programming& intro(2);它 - ALP书 - 几章解释了这一点。也许研究一些免费软件shell的源代码。还可以使用strace(1)

pipe(7)具有一定(小)容量PIPE_BUF(几千字节)。填充该管道时,将阻止写入过程。当读取过程已读取所有内容时,管道变空,并且读取过程被阻止。因此,编写过程有机会在其中运行和写入。

因此,您需要两个进程同时运行 (并且它们可以交换大量数据 - 例如几秒内的千兆字节)。而fork唯一制作新流程的方式。

答案 1 :(得分:1)

fork()或变体不仅是执行通过管道连接的程序,而且是执行任何程序所必需的。原因是 - exec..()函数系列将当前进程替换为由exec加载的进程。因此,为了让您的shell程序在子程序终止后继续,您必须调用fork()

对于管道,管道缓冲区相对较小,但程序通过管道进行通信的数据量可能很大。为了有效地工作,两个程序必须并行运行。