使用管道重现bash行为且永无止境的命令

时间:2018-12-08 14:57:41

标签: c bash pipe

我正在进行一个使用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;
}

1 个答案:

答案 0 :(得分:0)

简短的答案是:

摆脱初学者的wait()。

但是还有更多。不是说我是专家,而是通过观察bash行为,我了解到管道中的所有组件都是同时并行执行的

AFAIK,bash(或fifo的内核实现)将在管道另一侧的另一个进程关闭管道时向该进程生成信号。 'base64 / dev / urandom'之所以终止,是因为它在关闭头部的stdin时收到了一个信号。

如您所见,base64 / dev / urandom永远不会结束。

继续,开始所有进程,创建连接了stdout和stdin的fifo。我希望这能使您朝正确的方向前进。关于如何使用fifos的讨论很多,因此希望这对正确的方向有所帮助。