【发布时间】: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