gpt4 book ai didi

c - 许多 child 中只有一个 child 死了,其余的等待 ctrl + c

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:18:41 26 4
gpt4 key购买 nike

我正在为 Linux 中的 C shell 编写代码,我必须在其中实现多个管道(例如 A | B | c | D,其中 A、B、C、D 是命令)。 shell 为每个具有相同 pgid 的命令创建一个单独的进程,并使用 pipe() 系统调用连接它们的输入和输出。一旦创建了所有的 child , parent 使用 tcsetpgrp() 使这个 pgid 来到前台并进入后台。一切正常,但事实上,一旦执行 A、B、C、D 的 child 完成,只有处理 A 的 child 1 死亡并由 sigchild 处理程序处理,而其他 child 只是等待,什么也不做,直到我按下 ctrl + c。一旦按下 ctrl + c,所有其他 child 都会被信号处理程序收割,并且处于 sigsuspend 中的 parent 会醒来并再次回到前台。

任何人都可以帮助我理解为什么只有 child 1 死亡以及控制在哪里而其他 child 没有完成?

这是 SIGINT 处理程序的代码。

void sigchld_handler(int s) {

int olderrno = errno;
sigset_t mask_all;
sigset_t prev_all;

sigfillset(&mask_all);
while ((pid = waitpid(-1, &status, WNOHANG | WUNTRACED)) > 0) {
sigprocmask(SIG_BLOCK, &mask_all, &prev_all);
NoOfChildrenToBeReaped--;
sigprocmask(SIG_SETMASK, &prev_all, NULL);
}
errno = olderrno;

这是创建所需数量的子项后父项的代码。

//Get the pid of the first child and set it as the pgid of all the sibling children.
if (i == 0) {
pgid = pid;
}
setpgid(pid, pgid);

这里是父进程进入后台,跟踪有多少 child 要被收割,并在 sigsuspend() 之后返回前台。

if (BGProc) {
if (tcsetpgrp(STDIN_FILENO, pgid) == -1) {
printf(EXEC_ERROR, "Error in tcsetpgrp");
}

while (NoOfChildrenToBeReaped) {
sigsuspend(&masknone);
}

signal(SIGTTOU, SIG_IGN);
if (tcsetpgrp(STDIN_FILENO, getpid()) == -1) {
printf(EXEC_ERROR, "Error in tcsetpgrp");
}
}

非常感谢任何帮助。

谢谢。

最佳答案

这实际上是一个愚蠢的错误,而且确实是一个问题,因为用于管道的 FileDescriptors 没有正确关闭。感谢@Ctx 指出并通过评论提出好的建议。

for (i = 0; i < 2 * NoOfPipes; i++)
close(pipefds[j]); //should have been "i".

我想我忽略了“for”里面的代码,认为这是理所当然的。

关于c - 许多 child 中只有一个 child 死了,其余的等待 ctrl + c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47090525/

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