Не получает сигнал от родительского процесса

#c #signals #ipc

#c #сигналы #ipc

Вопрос:

Я изучаю связь между двумя процессами, используя сигналы на C на GeeksforGeeks https://www.geeksforgeeks.org/signals-c-set-2/?ref=lbp . И я пытался запустить код, представленный на веб-сайте. Я просто копирую код в онлайн-компилятор C.

 // C program to implement sighup(), sigint() 
// and sigquit() signal functions 
#include <signal.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <unistd.h> 

// function declaration 
void sighup(); 
void sigint(); 
void sigquit(); 

// driver code 
void main() 
{ 
    int pid; 

    /* get child process */
    if ((pid = fork()) < 0) { 
        perror("fork"); 
        exit(1); 
    } 

    if (pid == 0) { /* child */
        signal(SIGHUP, sighup); 
        signal(SIGINT, sigint); 
        signal(SIGQUIT, sigquit); 
        for (;;) 
            ; /* loop for ever */
    } 

    else /* parent */
    { /* pid hold id of child */
        printf("nPARENT: sending SIGHUPnn"); 
        kill(pid, SIGHUP); 

        sleep(3); /* pause for 3 secs */
        printf("nPARENT: sending SIGINTnn"); 
        kill(pid, SIGINT); 

        sleep(3); /* pause for 3 secs */
        printf("nPARENT: sending SIGQUITnn"); 
        kill(pid, SIGQUIT); 
        sleep(3); 
    } 
} 

// sighup() function definition 
void sighup() 

{ 
    signal(SIGHUP, sighup); /* reset signal */
    printf("CHILD: I have received a SIGHUPn"); 
} 

// sigint() function definition 
void sigint() 

{ 
    signal(SIGINT, sigint); /* reset signal */
    printf("CHILD: I have received a SIGINTn"); 
} 

// sigquit() function definition 
void sigquit() 
{ 
    printf("My DADDY has Killed me!!!n"); 
    exit(0); 
} 
  

Однако все, что я получил, похоже на это

 PARENT: sending SIGHUP                                                                                                                                                             
                                                                                                                                                                                   
                                                                                                                                                                                   
PARENT: sending SIGINT                                                                                                                                                             
                                                                                                                                                                                   
                                                                                                                                                                                   
PARENT: sending SIGQUIT
  

Мне интересно, это проблема с моим компьютером?

Комментарии:

1. Работает здесь, я не могу подтвердить какую-либо проблему (Ubuntu 20.04).

2. Я бы посоветовал попробовать запустить его в вашей системе и убедиться, что оба процесса существуют во время выполнения, я не думаю, что вам следует запускать несколько процессов в онлайн-компиляторе

3. Хотя ваш код не ошибочен, sigaction() обычно предпочтительнее в системах POSIX signal() , поскольку семантика sigaction() фактически переносима. Точное поведение signal() варьируется от реализации к реализации.

Ответ №1:

В коде неверно предполагается, что дочерний процесс устанавливает обработчики до того, как родительский процесс отправит сигналы. Это может быть так, но это не гарантировано. Конечно, если обработчики не установлены, дочерний процесс немедленно уничтожается. Вы можете подтвердить это, проверив, что kill возвращает -1 значение и errno имеет значение ESRCH .

Также имейте в виду, что printf это небезопасно для сигнала.

Комментарии:

1. Спасибо. Тогда как я могу изменить код или где я должен искать, чтобы исправить это?

2. Пусть родительский процесс установит обработчики раньше fork . Они наследуются дочерним процессом.

3. Что такое обработчики на самом деле

4. Функция, переданная signal , например void sighup . Он обрабатывает входящий сигнал.

Ответ №2:

Не все онлайн-компиляторы / среды C созданы одинаково. Попробуйте repl.it , Я только что попробовал и получил точные результаты, опубликованные geeks4geeks.