Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用C语言制作基本外壳,在管道/叉子方面遇到问题_C++_C_Unix_Fork_Pipe - Fatal编程技术网

C++ 使用C语言制作基本外壳,在管道/叉子方面遇到问题

C++ 使用C语言制作基本外壳,在管道/叉子方面遇到问题,c++,c,unix,fork,pipe,C++,C,Unix,Fork,Pipe,首先我想问一下,为什么管道中需要叉子?我对这一点相当陌生,但对我来说,我还不明白为什么我不能在|的左边运行一个进程,然后让下一部分在使用结果作为输入之后运行。我知道有人用叉子,但我不知道为什么需要叉子,也不知道在哪里需要叉子 非常感谢你回答这个问题,尽管这可能是个愚蠢的问题 阅读&;它-阿尔卑斯山的书-有几个章节解释这一点。也许还可以研究一些自由软件外壳的源代码。也使用 A有一定的(小)容量管道_BUF(几千字节)。当该管道被填满时,写入过程被阻塞。当读取过程读取了所有内容时,管道变空,读取过程

首先我想问一下,为什么管道中需要叉子?我对这一点相当陌生,但对我来说,我还不明白为什么我不能在|的左边运行一个进程,然后让下一部分在使用结果作为输入之后运行。我知道有人用叉子,但我不知道为什么需要叉子,也不知道在哪里需要叉子

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

阅读&;它-阿尔卑斯山的书-有几个章节解释这一点。也许还可以研究一些自由软件外壳的源代码。也使用

A有一定的(小)容量
管道_BUF
(几千字节)。当该管道被填满时,写入过程被阻塞。当读取过程读取了所有内容时,管道变空,读取过程被阻塞。因此,编写过程有机会在其中运行和编写

因此,您需要两个进程同时运行(它们可以在几秒钟内交换大量数据,例如千兆字节)。而
fork
是创建新进程的唯一方法。

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


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

底线是,在shell环境中,每个
管道
(例如:
echo“stuff”| sort
为管道的每一侧创建一个单独的进程,该进程在其自身的
PID
下运行(相当于C中的
fork
).进程间通信是通过
管道
完成的。例如,在C语言中,
fork
popen
函数。没有什么神秘的东西——只是它的工作方式。你可以像你说的那样实现管道,方法是将左手程序的所有输出保存到一个文件中,然后启动右手程序将该文件作为输入读取。这只是效率较低icient-这两个程序是按顺序运行的,而不是并行运行的,您可能需要大量的磁盘空间,等等。管道使用的磁盘空间非常少,大约为千字节。@MarkPlotnick:管道根本不使用磁盘空间。FIFO使用的磁盘空间非常少。