Как отправить сигнал процессу в C? - PullRequest
11 голосов
/ 08 октября 2011

Мне нужно отправить сигнал процессу, и когда процесс получает этот сигнал, он делает некоторые вещи, как это лучше всего достигается в C?

Ответы [ 3 ]

17 голосов
/ 08 октября 2011

Способ отправки сигнала процессу - kill(pid, signal); Однако вы должны знать, что сигналы не являются надежным средством межпроцессного взаимодействия, за исключением сообщений от родителя к непосредственному ребенку из-за присущих им состояний гонки. Каналы, файлы, каталоги, именованные семафоры, сокеты, разделяемая память и т. Д. Обеспечивают превосходный подход к межпроцессному взаимодействию.

4 голосов
/ 08 октября 2011

Если вы оказались в одном из вариантов Unix, вам помогут следующие справочные страницы:

man 2 kill
man 2 signal
man 2 sigvec
1 голос

kill + fork работающий пример POSIX

Время повеселиться:

#define _XOPEN_SOURCE 700
#include <assert.h>
#include <signal.h>
#include <stdbool.h> /* false */
#include <stdio.h> /* perror */
#include <stdlib.h> /* EXIT_SUCCESS, EXIT_FAILURE */
#include <sys/wait.h> /* wait, sleep */
#include <unistd.h> /* fork, write */

void signal_handler(int sig) {
    char s1[] = "SIGUSR1\n";
    char s2[] = "SIGUSR2\n";
    if (sig == SIGUSR1) {
        write(STDOUT_FILENO, s1, sizeof(s1));
    } else if (sig == SIGUSR2) {
        write(STDOUT_FILENO, s2, sizeof(s2));
    }
    signal(sig, signal_handler);
}

int main() {
    pid_t pid;

    signal(SIGUSR1, signal_handler);
    signal(SIGUSR2, signal_handler);
    pid = fork();
    if (pid == -1) {
        perror("fork");
        assert(false);
    } else {
        if (pid == 0) {
            while (1);
            exit(EXIT_SUCCESS);
        }
        while (1) {
            kill(pid, SIGUSR1);
            sleep(1);
            kill(pid, SIGUSR2);
            sleep(1);
        }
    }
    return EXIT_SUCCESS;
}

Скомпилируйте и запустите:

gcc -std=c99 signal_fork.c
./a.out

Итог:

SIGUSR1
SIGUSR2
SIGUSR1
SIGUSR2
....

Но учтите, что при работе с сигналами возникает много сложностей:

Протестировано в Ubuntu 17.10, GitHub upstream .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...