c语言 - 使用管道和永无止境的命令重现 bash 行为



我正在执行一个从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的讨论,所以希望这是朝着正确的方向发展。

最新更新