• SIGUSR1SIGUSR2 这是两个预留的用户自定义信号,编号通常为 10 和 12(不同体系可能略有差异),你可以像处理 SIGINT 一样为它们注册处理函数。
#include <stdio.h>
#include <signal.h>
#include <unistd.h>

static void my_handler(int sig) {
    printf("捕获到信号 %d\n", sig);
}

int main() {
    // 注册 SIGUSR1
    signal(SIGUSR1, my_handler);
    // 注册 SIGUSR2
    signal(SIGUSR2, my_handler);

    while (1) {
        printf("等待信号...\n");
        sleep(1);
    }
    return 0;
}

触发方式

kill(pid, SIGUSR1);   // 向 pid 进程发送 SIGUSR1
raise(SIGUSR1);			//向当前进程发送

#或者
kill -USR1 <进程ID> #向SIGUSR1发送信号
kill -10 <进程ID>   # 部分系统 SIGUSR1 编号为 10
  • 实时信号(Realtime Signals) 范围从 SIGRTMINSIGRTMAX(通常是 34~64),数量较多,支持队列化和按优先级递送,适合更复杂的自定义场景。
#include <stdio.h>
#include <signal.h>
#include <unistd.h>

void rt_handler(int sig, siginfo_t *info, void *ctx) {
    (void)ctx;
    printf("收到实时信号 %d,携带数值: %d\n", sig, info->si_value.sival_int);
}

int main() {
    struct sigaction act;
    act.sa_sigaction = rt_handler;
    act.sa_flags = SA_SIGINFO;
    sigemptyset(&act.sa_mask);
    sigaction(SIGRTMIN, &act, NULL);

    union sigval val;
    // 连续发送 5 个信号,附带不同数值
    for (int i = 1; i <= 5; i++) {
        val.sival_int = i * 10;
        sigqueue(getpid(), SIGRTMIN, val);
    }

    sleep(3); // 等待异步处理完成
    return 0;
}

输出会依次打印 10, 20, 30, 40, 50(保证顺序,不会丢失)。