gpt4 book ai didi

c - 使用管道和永不结束的命令重现 bash 行为

转载 作者:太空宇宙 更新时间:2023-11-04 04:14:11 25 4
gpt4 key购买 nike

我正在进行一个从 C 创建终端 shell 的项目(以 Bash 作为引用),我最终不得不处理管道。
我制作它们的方式是使用基本命令,如 ls |转 | wc -l
但是,当我尝试像这样传递永不结束的命令时,我的程序进入了一个永无止境的循环:base64/dev/urandom |头-c 1000; Bash 没有。
我创建管道的方式让我的程序在调用 head 之前等待 base64 结束。
我不明白我应该何时以及如何等待和执行命令了。
如何在 C 中使用此类管道命令重现 Bash 的行为?我是犯了一个简单的错误还是应该彻底重新考虑我的系统?

这是我如何执行命令的伪代码。它缺乏关闭管道等细节和安全性,但整个想法都存在。

while (command)
{
pipe(fd);
if (!fork())
{
dup2();
execve(command);
}
wait();
command = command->next;
}

最佳答案

简短的回答是:

首先摆脱 wait()。

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

据我所知,当管道另一端的另一个进程关闭管道时,bash(或者可能是 fifo 的内核实现)将向进程生成信号。 'base64/dev/urandom' 终止,因为它在 head 关闭时收到了一个信号,它是标准输入。

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

接下来,启动所有进程,创建连接了标准输出和标准输入的 fifo。我希望这能让你朝着正确的方向前进。有很多关于如何使用 fifos 的讨论,所以希望这是朝着正确方向的插入。

关于c - 使用管道和永不结束的命令重现 bash 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53683729/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com