【发布时间】:2020-10-06 16:37:06
【问题描述】:
我正在尝试构建一个 minishell,但除了管道之外,我几乎什么都有。我在这个网站和许多其他网站上阅读了很多答案,但我无法找到我的特定问题。
序列应该在最右边的进程结束时结束,即:sleep 3 | sleep 3 | sleep 0 应该立即结束,而不是等待任何 sleep 3 进程。
*argvv 是指向第一个进程的指针(*argvv 将是sleep 3,*(argvv + 1) 是下一个sleep 3,等等。我不知道发生了什么,但有问题文件描述符和测试后一切都会中断。
例如,当输入为sh> ls | wc | wc时,输出为
sh> ls | wc | wc
sh> 1 3 25
,然后它等待一些输入。直到我再次按下回车它才完成。之后,sleep 3 就不再工作了。
欢迎任何帮助,非常感谢!
编辑:
好的,我编辑了代码,似乎一切正常,除了 sleep 3 | sleep 0 持续 3 秒,而不是立即结束。我不知道如何解决这个问题。
void execute(char ***argvv)
{
pid_t pid;
int pd[2];
int in = 0;
while (*argvv != NULL) {
pipe(pd);
if ((pid = fork()) < 0)
{
perror();
exit(1);
}
else if (pid == 0) {
dup2(in, 0);
if (*(argvv + 1) != NULL)
dup2(pf[1], 1);
close(pd[0]);
close(pd[1]);
execvp((*argvv)[0], *argvv);
perror();
exit(1);
}
else
{
close(pd[1]);
in = pd[0];
if (*(argvv + 1) == NULL)
close(pd[0]);
argvv++;
}
wait(&pid);
}
}
【问题讨论】:
-
哎呀,three star programmer!
if (argvv == NULL)我认为是错误的。something is wrong with file descriptors and everything breaks after a test.请说明什么是错误的,什么是中断的,以及你正在运行什么测试。请创建一个minimal reproducible example。 -
@KamilCuk 明白了!我编辑了帖子,修复了您告诉我的内容并添加了一个示例。谢谢!
-
提供的函数有点草率,因为它创建的管道比实际需要或使用的管道多,并且它使所有管道的读取端在父进程中无限期地打开。至少后者是一个严重的问题:它是一种资源泄漏形式,会很快导致损坏。
-
还有一个 pid 泄漏,您没有提供使用
wait-family 功能之一收集每个孩子或将该职责转移到其他一些进程 - 例如,双重 @987654334 @ing 让流程 1 承担该责任。 -
关于您上次的编辑,请阅读How should we treat posts that are vandalized by their original authors? 请不要通过破坏您的帖子来为他人增加工作量。通过在 Stack Overflow 上发帖,您已根据 CC BY-SA 4.0 许可授予 Stack Overflow 分发该内容的不可撤销权利。根据 Stack Overflow 政策,任何破坏行为都将被撤销。
标签: c shell while-loop pipe execvp