我正在进行一个从C创建终端shell的项目(以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;
}
最佳答案
简而言之,答案是:
摆脱初学者的等待。
但还有更多。我不是专家,但通过观察bash行为,我了解到管道中的所有组件都是并行执行的
AFAIK、bash(或者fifo的内核实现)将在管道另一侧的另一个进程关闭管道时,向该进程生成信号base64/dev/urandom'终止,因为它在头关闭时接收到一个信号,它是stdin。
如您所见,base64/dev/urandom永远不会自行结束。
接下来,启动所有进程,创建连接stdout和stdin的fifo。我希望这能让你走对方向。有很多关于如何使用fifos的讨论,所以希望这是一个正确的方向。
关于c - 使用管道重现bash行为且永无止境的命令,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53683729/