我正在进行一个使用C创建终端外壳的项目(以Bash为参考),因此我不得不处理管道。
我使它们与ls | rev | wc -l
等基本命令配合使用的方式
但是,当我尝试管道永无止息的命令时,程序进入了永无止境的循环:base64 /dev/urandom | head -c 1000
; Bash没有。
创建管道的方式使程序在调用base64
之前先等待head
结束。
我不知道应该何时以及如何等待和执行命令。
如何使用C中的此类管道命令重现Bash的行为?我犯了一个简单的错误,还是我应该完全重新考虑我的系统?
这里是伪代码,说明我如何执行命令。它缺少诸如关闭管道之类的细节和安全性,但是整个想法都存在。
while (command)
{
pipe(fd);
if (!fork())
{
dup2();
execve(command);
}
wait();
command = command->next;
}
答案 0 :(得分:0)
简短的答案是:
摆脱初学者的wait()。
但是还有更多。不是说我是专家,而是通过观察bash行为,我了解到管道中的所有组件都是同时并行执行的
AFAIK,bash(或fifo的内核实现)将在管道另一侧的另一个进程关闭管道时向该进程生成信号。 'base64 / dev / urandom'之所以终止,是因为它在关闭头部的stdin时收到了一个信号。
如您所见,base64 / dev / urandom永远不会结束。
继续,开始所有进程,创建连接了stdout和stdin的fifo。我希望这能使您朝正确的方向前进。关于如何使用fifos的讨论很多,因此希望这对正确的方向有所帮助。