Linux信号的使用
✅ 信号的基本概念
🔹定义:信号是异步事件通知机制,用于进程间通信或内核通知进程某事件发生。
🔹常见信号:
SIGINT (2):终端中断(Ctrl+C)。
SIGKILL (9):强制终止进程(不可捕获或忽略)。
SIGTERM (15):请求进程终止(可处理)。
SIGSEGV (11):段错误(非法内存访问)。
SIGCHLD (17):子进程状态改变(如终止)。
其他:SIGQUIT、SIGALRM、SIGPIPE等。
✅ 信号的产生方式
🔹用户输入:如Ctrl+C(SIGINT)、Ctrl+\(SIGQUIT)。
🔹系统调用/命令:kill()函数或kill命令发送信号。
🔹内核生成:如硬件异常(除零错误→SIGFPE)、子进程终止(SIGCHLD)。
✅ 信号的处理
🔹默认行为:终止进程(Term)、忽略(Ignore)、暂停(Stop)等。
🔹自定义处理:通过signal()或更安全的sigaction()注册处理函数。
1 | |
1 | |
🔹不可捕获的信号:SIGKILL和SIGSTOP不能被捕获或忽略。
✅ 信号阻塞与信号集
🔹信号集操作:sigemptyset、sigfillset、sigaddset、sigdelset。
🔹进程信号屏蔽字:通过sigprocmask()阻塞/解除阻塞信号。
1 | |
🔹多线程:pthread_sigmask()设置线程级信号屏蔽。
✅ 可靠信号与实时信号
🔹不可靠信号(1~31):可能丢失,同种信号多次触发只处理一次。
🔹实时信号(SIGRTMIN~SIGRTMAX):支持排队,通过sigqueue()发送携带数据的信号。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <signal.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
if (argc != 2) {
printf("Usage: %s <PID>\n", argv[0]);
return 1;
}
pid_t pid = atoi(argv[1]);
union sigval value;
value.sival_int = 5678;
sigqueue(pid, SIGRTMIN, value);
return 0;
}
1 | |
✅ 关键函数与系统调用
🔹kill()/raise():发送信号到进程或自身。
🔹pause():挂起进程直到信号到达。
🔹sigsuspend():原子操作“解除信号阻塞 + 等待信号”。
🔹alarm()/setitimer():设置定时器触发SIGALRM。
1 | |
🔹sigwait():同步等待信号(多线程中常用)。
Linux信号的使用
https://chrisy0618.github.io/2025/04/19/signal/