【问题标题】:Why Don't The Children Recive The Signal为什么孩子们没有收到信号
【发布时间】:2017-12-26 15:48:34
【问题描述】:

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

家长:

#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;
}

孩子:

#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;
}

【问题讨论】:

  • 不清楚为什么您在父级中包含receiveCard() 的代码。此外,这里还有一个明显的竞争条件。
  • 我看到了一个例子,其中处理程序也包含在父级中,但不确定这是否是我的问题。我忘了删除它。

标签: c signals system-calls


【解决方案1】:

你有一个竞争条件。

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

因此,孩子无法足够快地设置处理程序。也就是当信号进来的时候,孩子仍然忽略它,因为它已经继承了父母的SIG_IGN调用。

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

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

【讨论】:

  • @EOF 我想我在第二句中已经提到了这一点:在任何孩子有机会做execlp之前就进入了kill循环跨度>
  • 我还是觉得这个答案有点不清楚。我要指出的是,比赛窗口从父级的fork() 开始,以子级的signal() 结束。值得注意的是,它execlp()结尾。
猜你喜欢
  • 2022-01-22
  • 1970-01-01
  • 2019-07-30
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多