C 为什么不';孩子们没有收到信号吗

C 为什么不';孩子们没有收到信号吗,c,signals,system-calls,C,Signals,System Calls,我有一个父进程,它根据传递给程序的第一个参数生成X个子进程(player)。在每个孩子出生后,它会向他们发送一个信号。现在我想让孩子们做的就是打印他们收到信号并退出,但他们似乎没有从父母那里得到信号。孩子们是没有收到信号,还是我处理错了 家长: #define _POSIX_SOURCE #include <stdio.h> #include <signal.h> #include <stdlib.h> #include <unistd.h> #

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

家长:

#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;
}
#定义POSIX_SOURCE
#包括
#包括
#包括
#包括
#包括
#包括
void reciveCard(){
写入(1,“接收信号\n”,15);
出口(0);
}
int main(int argc,字符**argv){
国际货币基金组织;
int*kpid;
numPlayers=atoi(argv[1]);
kpids=malloc(numlayers*sizeof(int));
信号(SIGUSR1,SIG_IGN);
对于(i=0;i
儿童:

#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;
}
#包括
#包括
#包括
#包括
void reciveCard(){
写入(1,“接收信号\n”,15);
出口(0);
}
int main(){
信号(SIGUSR1,接收卡);
而(1){
睡眠(1);
}
返回0;
}

您有竞争条件

父程序执行
fork
调用的速度如此之快,以至于在任何子程序有机会执行
execlp
之前,它就陷入了
kill
循环

因此,孩子无法足够快地设置处理程序。也就是说,当信号传入时,子级仍然忽略它,因为它继承了父级的
SIG\u IGN
调用

现在,在执行完
execlp
之后,子进程将设置处理程序,但信号已经出现,因此将永远不会调用该处理程序


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

不清楚为什么要在父循环中包含
receiveCard()
的代码。此外,这里还有一个明显的竞争条件。我看到过一个示例,其中处理程序也包含在父级中,不确定这是否是我的问题。我忘了删除它。@EOF我想我在第二句中用了:在任何孩子有机会执行
execlp
之前落入
kill
循环中,我仍然认为这个答案有点不清楚。我要指出的是,race窗口从父级中的
fork()
开始,并以子级中的
signal()
结束。值得注意的是,它不会以
execlp()
结尾。