signal信号
2026/8/25大约 2 分钟
Linux 进程间通信:Signal 信号
1. Signal 是什么
Signal(信号)是一种异步通知机制。
它不是用来传输大量数据,而是告诉进程:
发生了一件事。
Ctrl+C
↓
SIGINT
↓
进程
↓
信号处理函数2. signal():注册信号处理函数
signal(SIGINT, myHandler);表示:
收到
SIGINT后执行myHandler()。
3. 常见信号
SIGINT → Ctrl+C
SIGQUIT → Ctrl+\
SIGALRM → alarm() 到期
SIGSTOP → 暂停进程
SIGKILL → 强制终止进程SIGSTOP 和 SIGKILL 不能被捕获、忽略或阻塞。
4. alarm():定时发送 SIGALRM
alarm(5);表示:
alarm(5)
↓
5 秒后
↓
SIGALRM所以:
alarm()负责定时产生信号。
5. pause():等待信号
pause();表示:
阻塞当前进程,直到收到信号。
典型流程:
alarm(3)
↓
pause()
↓
等待
↓
SIGALRM
↓
pause() 返回6. kill() 和 raise()
kill()
kill(pid, SIGKILL);向指定 PID 的进程发送信号。
raise()
raise(SIGSTOP);向当前进程自己发送信号。
7. sigaction()
相比 signal(),实际 Linux 编程更推荐 sigaction()。
struct sigaction act;
act.sa_handler = myHandler;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
sigaction(SIGINT, &act, NULL);核心:
sa_handler → 信号处理函数
sa_mask → 处理期间屏蔽的信号
sa_flags → 信号处理选项8. Signal 和信号量
不要混淆:
Signal
↓
异步通知
↓
“发生了一件事”
Semaphore
↓
同步 / 互斥
↓
“现在能不能继续”9. 一句话记忆
Signal = Linux 给进程发送的异步通知。
kill() / raise() / alarm()
↓
产生信号
↓
signal() / sigaction()
↓
信号处理函数
pause()
↓
等待信号10. 关键代码
注册信号处理函数
void myHandler(int sig)
{
if (sig == SIGINT)
printf("I have got SIGINT\n");
}
signal(SIGINT, myHandler);定时发送 SIGALRM
void myHandler(int sig)
{
printf("HelloJack\n");
}
signal(SIGALRM, myHandler);
alarm(5);等待信号
alarm(3);
printf("Timer has been set!\n");
pause();
printf("I have been waken up!\n");向指定进程发送信号
kill(pid, SIGKILL);向自己发送信号
raise(SIGSTOP);sigaction() 注册
struct sigaction act;
act.sa_handler = myHandler;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
sigaction(SIGINT, &act, NULL);
sigaction(SIGQUIT, &act, NULL);信号处理函数参数
void myHandler(int sig)
{
if (sig == SIGINT) {
printf("I have got SIGINT\n");
}
else if (sig == SIGQUIT) {
printf("I have got SIGQUIT\n");
}
}
