Я написал программу, в которой родительский процесс выдает 5 (лотерейных) номеров, полученных из списка параметров. Затем дочерний процесс генерирует 5 случайных чисел, и если одно из этих чисел равно параметрам, оно отправляет сигнал SIGUSR1, иначе SIGUSR2 в родительский процесс. Если я не использую сигналы, просто просто напечатайте ответы от ребенка, код работает нормально. Но с сигналами родительский процесс запускается дважды или, по крайней мере, его содержимое распечатывается дважды. Не могли бы вы объяснить мне такое поведение? Заранее спасибо!Родительский процесс запускается дважды после получения сигнала
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <errno.h>
#include <signal.h>
void handler(int signumber){
printf("The child got a hit, my pid: %i\n", getpid());
}
void handler2(int signumber){
printf("The child had no hit!\n");
}
int main(int argc, char* argv[])
{
signal(SIGUSR1,handler);
signal(SIGUSR2,handler2);
int status, child;
int num1 = atoi(argv[1]);
int num2 = atoi(argv[2]);
int num3 = atoi(argv[3]);
int num4 = atoi(argv[4]);
int num5 = atoi(argv[5]);
if (num1<0 || num1>45 || num2<0 || num2>45 || num3<0 || num3>45 || num4<0 || num4>45 || num5<0 || num5>45){
perror("We need 5 numbers in range of 0 and 45");
exit(1);
}
child = fork();
if(child>0){ //parent
printf("The numbers: %i, %i, %i, %i, %i. my pid: %i \n", num1,num2,num3,num4,num5,getpid());
} else{
int rnd,i,isAnyHit;
isAnyHit = 0;
srand(time(NULL) * (getpid()));
for (i=0;i<5;i++){
rnd = ((rand()%45)+1);
if (rnd == num1 || rnd == num2 || rnd == num3 || rnd == num4 || rnd == num5){
kill(getppid(),SIGUSR1);
isAnyHit++;
}
}
if (isAnyHit == 0)
kill(getppid(),SIGUSR2);
}
return 0;
}
Что произойдет, если будет проведено более одного номера? Похоже, вы отправите SIGUSR1 потенциально 5 раз, если все 5 номеров совпадают правильно? – Trenin
Это поможет, если вы сообщите нам, какое сообщение дублируется. Кроме того, нам будет легче читать код, если вы переводите сообщения на английский (какой язык венгерский?). Странно, что у вас нет родителя, ожидающего ребенка, поэтому, когда вы дойдете до убийства (getppid(), ...) у ребенка, скорее всего, ваш родитель уже вышел, ваш процесс был унаследован по init-процессу, и вы отправляете сигналы init (надеюсь, вы не делаете это как root!) –
Возможно, что printf родителя прерывается сигналом, а два параллельных printfs путают некоторые структуры данных. Если вы замените 'printf (« Szülő: A lottó számok:% i,% i,% i,% i,% i. Pid számom:% i \ n ", num1, num2, num3, num4, num5, getpid ()); 'с' pause(); ', все работает? В общем случае обработчики сигналов C не должны делать ничего больше, чем изменять изменчивую переменную. –