Программа с вилкой () и обработкой сигнала в c

Hi то, что я пытаюсь сделать здесь, это программа, которая начинается с регистрации it’s pid в файловом сервере.зафиксировать то следует делать вилкой (). Сын должен сказать, что он начал работать, чем сделать пассивное ожидание и вооружить сигнал SIGUSR2, и когда он получает его, он должен прекратить его исполнение и написать «прощай жестокий мир». Родитель должен написать это начало и сделать пассивное ожидание, а затем вооружить сигналы SIGUSR1 и SIGINT. Если он получает SIGUSR1, он сам должен отправить сигнал SIGUSR2 сыну, и если он получает сигнал SIGINT, если это первый раз, когда он получает его, он должен сказать, что он получил сигнал, если это второй раз, он должен отправить сигнал SIGUSR2 сыну, чтобы он прекратил сына и его исполнение. Теперь моя проблема с родителем, я не знаю, почему, но во второй раз, когда он получает сигнал, он говорит об ошибке «определяемый пользователем Сигнал 2» и уходит, если кто-то может объяснить мне, что я делаю неправильно Здесь, я был бы очень признателен. Вот код. Спасибо!.

int p = 1;
int son;

void handle_SIGINT(int signal){
  if ( p==1 ) {
     p = 2;
     printf("The authentication module received the signal SIGINTn");
  }else{
     kill( son, SIGUSR2);
     exit(0);
  }
}

void handle_SIGUSR1(int signal){
  kill( son, SIGUSR2);
}

void handle_SIGUSR2(int signal){
  printf("Goodbye cruel worldn");
  exit(0);
}

void main(){


    int pid = getpid();
    FILE *f = fopen("server.lock", "w");
    fprintf( f, "%d", pid );
    fclose(f);

int n = fork();

    if ( n==0 ) {
        printf("The message handling module has startedn");
        signal(SIGUSR2, handle_SIGUSR2);
        while(1)
                pause();
    }else{
        printf("The authentication module has startedn");

        son = getpid();

        signal(SIGUSR1, handle_SIGUSR1);

        signal(SIGINT, handle_SIGINT);

        while(1)
            pause();
   }
}

1 ответ

  1. Ваше имя смутило меня. Похоже, что проблема-это переменная с именем son. Это не процесс «сын или ребенок». Это родитель.

    forkВызов возвращается дважды. Один раз в родителя и один раз в ребенка. В родителе возвращает PID ребенка. Возвращает 0 в дочернем элементе. Вы их перевернули!

    Вы используете signalвместо sigaction. Я рекомендую использовать sigaction. Это гораздо сложнее, но дает гораздо больше вариантов, а также.

    Проблема signalзаключается в том, что после вызова обработчика он сбрасывает сигнал на поведение по умолчанию. Но и это не гарантируется. Библиотека GNU C ведет себя по-разному в зависимости от if _BSD_SOURCE, _GNU_SOURCEили ничего не определено. То есть имитировать, как он вел себя на BSD UNIX или SysV UNIX. И именно поэтому sigactionэто лучший выбор, он действует так же на каждой системе POSIX.