gpt4 book ai didi

C Minishell - 管道实现需要杀僵尸

转载 作者:行者123 更新时间:2023-12-01 12:49:04 24 4
gpt4 key购买 nike

所以我正在用 C(用于 unix)构建一个 minishell。我只是想出了如何让管道工作,但是我遇到了僵尸问题。假设我有:

echo a | echo b | echo c

这不输出任何东西,当它应该输出“c”时。但是,如果我告诉我的 shell 执行每个子命令,然后在继续执行下一个命令之前等待,它就可以正常工作。然而,这不是一个真正的解决方案,因为我希望在不等待的情况下获得管道之间的自然协调。

我无法设计一种有效的方法来在执行最后一个命令后等待所有僵尸。我在最后一次执行之后尝试这样做,但在 shell 退出之前:

while(waitpid(-1, NULL, WNOHANG) > 0);

然而,没有运气。到目前为止,唯一可行的方法是告诉我的 shell 执行每个子命令,然后在开始下一个命令之前等待。这是整个主 shell 文件:

http://pastebin.com/YV96mFy7

处理输入的主要函数(processline()) 从第 105 行开始。

感谢您的帮助,如果你们还需要什么,尽管问。

最佳答案

改变这个

while(waitpid(-1, NULL, WNOHANG) > 0);

收件人:

while(wait(NULL) > 0);

/* which is equivalent to */
while(waitpid(-1, NULL, 0) > 0);

这将导致父进程等待所有子进程完成,如果您不想阻止父进程,则捕获 SIGCHLD 并调用 wait() 而不是在信号处理程序中。

关于C Minishell - 管道实现需要杀僵尸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13656344/

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