Как отправить сигнал от дочернего процесса на родительский процесс с помощью команды kill - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь создать дочерний процесс с помощью fork() системного вызова, затем пытаюсь отправить сигнал родителю и распечатать что-то на экране.

Вот мой код: -

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>

void func1(int signum) {
    if(signum == SIGUSR2) {
        printf("Received sig from child\n");
    }
}

int main() {
    signal(SIGUSR2, func1);

    int c = fork();
    if(c > 0) {
        printf("parent\n");
    }
    else if(c == -1) {
        printf("No child");
    }
    else {
        kill(getppid(), SIGUSR2);
        printf("child\n");
    }

}

Когда я выполняю свою программу, все, что я получаю, это: -

child
Segmentation fault (core dumped)

Я новичок в системных вызовах языка Си, и не понимаю, почему это происходит, и как получить желаемый результат, который будет выводить все три оператора printf. Любая помощь для того же будет приветствоваться.

1 Ответ

0 голосов
/ 07 января 2019

Ваш код имеет ряд незначительных проблем и, безусловно, имеет неопределенное поведение, то есть вы не можете вызывать printf или другие небезопасные функции асинхронного сигнала из обработчика сигнала. Это код с исправлениями (см. Комментарии в коде). Это должно работать должным образом (без определенного порядка операторов печати) и посмотреть, не получит ли еще segfault с этим кодом.

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

void func1(int signum)
{
    /* write is asyc-signal-safe */
    write(1, "Received sig from child\n", sizeof "Received sig from child\n" - 1);
}

int main()
{
    signal(SIGUSR2, func1);

    /* fork returns a pid_t */
    pid_t c = fork();
    if(c > 0) {
        printf("parent\n");
        /* Wait for the child to exit; otherwise, you may not receive the signal */
        if (wait(NULL) == -1) {
            printf("wait(2) failed\n");
            exit(1);
        }
    } else if (c == -1) {
        printf("fork(2) error\n");
        exit(1);
    } else {
        if (kill(getppid(), SIGUSR2) == -1) {
            /* In case kill fails to send signal... */
            printf("kill(2) failed\n");
            exit(1);
        }
        printf("child\n");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...