为什么 Children 收不到信号
Why Don't The Children Recive The Signal
我有一个 parent 进程,它根据传递给程序的第一个参数生成 X 个 child 进程(玩家)。在每个 child 生成后,它都会向它们发送一个信号。现在我只希望 children 打印他们收到信号并退出,但他们似乎没有从 parent 获得信号。 children 是没有收到信号还是我处理错了?
Parent:
#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[=11=]", "./player[=11=]", (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;
}
您有竞争条件。
parent 程序执行 fork
调用所以 fast 它落入 kill
循环 before 任何 child 都有机会做 execlp
.
因此,child 无法足够快地设置处理程序。也就是说,当信号进来时,child 仍然忽略它,因为它继承了 parent 的 SIG_IGN
调用。
现在,在 execlp
之后,child 将设置处理程序,但信号 已经发生 ,因此处理程序将 从不被调用。
要查看此内容,请在两个 parent 循环之间添加一个 sleep(1)
,它应该会起作用。
我有一个 parent 进程,它根据传递给程序的第一个参数生成 X 个 child 进程(玩家)。在每个 child 生成后,它都会向它们发送一个信号。现在我只希望 children 打印他们收到信号并退出,但他们似乎没有从 parent 获得信号。 children 是没有收到信号还是我处理错了?
Parent:
#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[=11=]", "./player[=11=]", (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;
}
您有竞争条件。
parent 程序执行 fork
调用所以 fast 它落入 kill
循环 before 任何 child 都有机会做 execlp
.
因此,child 无法足够快地设置处理程序。也就是说,当信号进来时,child 仍然忽略它,因为它继承了 parent 的 SIG_IGN
调用。
现在,在 execlp
之后,child 将设置处理程序,但信号 已经发生 ,因此处理程序将 从不被调用。
要查看此内容,请在两个 parent 循环之间添加一个 sleep(1)
,它应该会起作用。