我正在执行一个从C创建终端shell的项目(使用Bash作为引用(,我在环境中不得不处理管道
我使它们与ls | rev | wc -l
等基本命令一起工作的方式
然而,当我尝试管道传输从未像这样结束的命令时,我的程序进入了一个永无止境的循环:base64 /dev/urandom | head -c 1000
;Bash没有
我创建管道的方式使我的程序在调用head
之前等待base64
结束
我不明白我应该在什么时候以及如何等待&再执行命令
如何用C中的管道命令重现Bash的行为?我是犯了一个简单的错误,还是应该彻底重新思考我的系统?
以下是我如何执行命令的伪代码。它缺乏细节&安全就像关闭管道,但整个想法都是存在的。
while (command)
{
pipe(fd);
if (!fork())
{
dup2();
execve(command);
}
wait();
command = command->next;
}
简单的答案是:
摆脱对初学者的等待((。
但还有更多。我不是专家,但通过观察bash行为,我了解到管道中的所有组件都是在并行中同时执行的
当管道另一侧的另一个进程关闭管道时,AFAIK、bash(或者可能是fifo的内核实现(将向该进程生成信号base64/dev/urandom终止,因为它在头关闭它的stdin时收到了一个信号。
正如您所看到的,base64/dev/urandom本身永远不会结束。
接下来,启动所有进程,创建连接了stdout和stdin的fifo。我希望这能让你朝着正确的方向前进。有很多关于如何使用fifo的讨论,所以希望这是朝着正确的方向发展。