gpt4 book ai didi

c - 如何等待子进程发送信号?

转载 作者:太空宇宙 更新时间:2023-11-04 01:58:45 26 4
gpt4 key购买 nike

#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <sys/types.h>

void handler(int signumber)
{
return;
}

int main()
{
int i, pid;
int children_count = 5;
int arr_childprocesses[5];
int parent_pid = getpid();

for(i=0;i<children_count;i++)
{
pid = fork();
if(pid == -1)
{
perror("Err");
exit(EXIT_FAILURE);
}

if(pid == 0) break;

arr_childprocesses[i] = pid;
}

if (pid == 0) // children
{
kill(parent_pid,SIGUSR1);
printf("Child(%d) sig sent. Waiting 5s...\n",getpid());
sleep(5);
printf("Child(%d) terminated.\n",getpid());
}
else // parent
{
signal(SIGUSR1,handler);
for(i=0;i<children_count;++i)
{
waitpid(arr_childprocesses[i],NULL,0);
printf("Parent: Signal received.\n");
}
printf("Parent(%d) signals received. Waiting 3s...\n",getpid());
sleep(3);
printf("Parent(%d) terminated.\n",getpid());
}

exit(EXIT_SUCCESS);
}

我想等到所有的 child 都给我一个信号。然后与 child 和 parent 一起做一些工作。但是程序会停止,直到所有 child 都终止。我应该怎么做?

结果:

enter image description here

更新 1:包含完整代码和结果

最佳答案

您可能正在这里面对一场比赛。

父级在设置此信号的处理程序之前收到 SIGUSR1。由于接收 SIGUSR1 时的默认行为是结束,因此父进程死亡。

您想派生子进程之前在父进程中设置信号处理程序。

(如果从程序设计的角度来看,子程序设置SIGUSR1 信号处理程序是 Not Acceptable ,只需调用signal(SIGUSR1, SIG_DFL) 作为内部的第一个语句 child 卸载这个处理程序。)

为了证明这个理论,您可能希望在调用 kill() 之前暂时在子进程中添加一个sleep(1); >.


作为完成任务的提示:

看看sigaction()因为它提供了比函数 signal() 更强大的信号接口(interface)。请特别阅读 SA_SIGINFO 标志,因为它可以将 siginfo_t 类型的变量传递给您的信号处理程序。后一个变量包含有关谁(由 PID 标识)发送信号的信息,这是解决方案的关键。

关于c - 如何等待子进程发送信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30014553/

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