SIGUSR1和SIGUSR2这是两个预留的用户自定义信号,编号通常为 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)
范围从
SIGRTMIN到SIGRTMAX(通常是 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(保证顺序,不会丢失)。