我正在进行一个从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/

10-08 22:42
查看更多