如何向C中的进程发送信号?

时间:2011-10-08 12:51:15

标签: c signals

我需要向一个进程发送一个信号,当进程收到这个信号它会做一些事情时,如何在C中实现最佳效果?

3 个答案:

答案 0 :(得分:17)

向进程发送信号的方式是kill(pid, signal);但是,您应该知道信号不是一种强大的进程间通信方式,除了由于固有竞争导致的父对直接子消息条件。管道,文件,目录,命名信号量,套接字,共享内存等都为进程间通信提供了极好的方法。

答案 1 :(得分:4)

如果您碰巧使用其中一种Unix变体,以下手册页将有所帮助:

man 2 kill
man 2 signal
man 2 sigvec

答案 2 :(得分: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