gpt4 book ai didi

c - 为什么 children 收不到信号

转载 作者:太空宇宙 更新时间:2023-11-04 02:29:42 24 4
gpt4 key购买 nike

我有一个父进程,它根据传递给程序的第一个参数生成 X 个子进程(播放器)。在生成每个 child 后,它会向他们发送一个信号。现在我只希望 children 打印他们收到信号并退出,但他们似乎没有从 parent 那里得到信号。是 children 没有收到信号还是我处理不当?

家长:

#define _POSIX_SOURCE 
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

void reciveCard() {
write(1, "signal recived\n", 15);
exit(0);
}

int main(int argc, char **argv) {
int numPlayers, i;
int *kpids;

numPlayers = atoi(argv[1]);

kpids = malloc(numPlayers * sizeof(int));

signal(SIGUSR1, SIG_IGN);
for(i = 0; i < numPlayers; i++) {
if((kpids[i] = fork()) == 0) {
if(execlp("./player\0", "./player\0", (char *) NULL) == -1) {
printf("error\n");
exit(1);
}
}
}

for(i = 0; i < numPlayers; i++) {
printf("%d\n", kpids[i]);
kill(kpids[i], SIGUSR1);
}

wait(NULL);
return 0;
}

child :

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>

void reciveCard() {
write(1, "signal recived\n", 15);
exit(0);
}
int main() {

signal(SIGUSR1, reciveCard);
while(1) {
sleep(1);
}

return 0;
}

最佳答案

你有一个竞争条件。

父程序执行 fork 调用的速度非常,以至于它在任何子程序 之前落入 kill 循环有机会执行 execlp

因此, child 无法足够快地设置处理程序。也就是说,当信号进来时, child 仍然忽略它,因为它继承了 parent 的 SIG_IGN 调用。

现在,在 execlp 之后,子进程将设置处理程序,但是信号已经发生了,因此处理程序永远不会 被调用。

要看到这一点,请在两个父循环之间添加一个 sleep(1),它应该可以工作。

关于c - 为什么 children 收不到信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45223315/

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