gpt4 book ai didi

c - 我如何确定在使用 pause() 时不会丢失信号?

转载 作者:可可西里 更新时间:2023-11-01 11:50:42 24 4
gpt4 key购买 nike

我正在编写一个程序,该程序使用 fork 创建子进程并在它们完成时对其进行计数。我如何确定我没有丢失信号?如果子程序发送信号而主程序仍在处理先前的信号,会发生什么情况?信号“丢失”了吗?我怎样才能避免这种情况?

void my_prog()
{
for(i = 0; i<numberOfDirectChildrenGlobal; ++i) {
pid = fork();
if(pid > 0)//parent
//do parent thing
else if(0 == pid) //child
//do child thing
else
//exit with error
}

while(numberOfDirectChildrenGlobal > 0) {
pause(); //waiting for signal as many times as number of direct children
}

kill(getppid(),SIGUSR1);
exit(0);
}

void sigUsrHandler(int signum)
{
//re-register to SIGUSR1
signal(SIGUSR1, sigUsrHandler);
//update number of children that finished
--numberOfDirectChildrenGlobal;
}

最佳答案

建议使用 sigaction 而不是 signal,但在这两种情况下它都不会提供您需要的东西。如果一个 child 在前一个信号仍在处理时发送一个信号,它将成为一个未决信号,但如果发送了更多信号,它们将被丢弃(在不阻塞传入信号的系统上,信号可以在重新建立之前传递处理程序并再次导致丢失信号)。对此没有解决方法。

通常做的是假设一些信号丢失,并让处理程序处理退出的 child 。

在你的情况下,不要从你的 child 那里发送信号,而是让 child 终止。一旦它们终止,应该使用父进程的 SIGCHLD 处理程序来获取它们。将 waitpid 与 WNOHANG 选项一起使用可确保父级将捕获所有子级,即使它们同时终止也是如此。

例如,计算已退出子进程数量的 SIGCHLD 处理程序可以是:

 pid_t pid;

while((pid = waitpid(-1, NULL, WNOHANG)) > 0) {
nrOfChildrenHandled++;
}

关于c - 我如何确定在使用 pause() 时不会丢失信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5377555/

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