进程间通信信号(Signals)详解
创作时间:
作者:
@小白创作中心
进程间通信信号(Signals)详解
引用
1
来源
1.
https://2743.com/archives/17449
在Linux和Unix系统中,信号(Signal)是一种进程间通信(IPC)机制,用于通知进程发生了某种事件。信号是一种异步的通知方式,操作系统或其他进程可以随时向目标进程发送信号,以让其执行特定的操作,如终止、暂停、继续运行等。
一、什么是信号(Signals)?
- 信号是进程间的异步通知机制,可以用于通知进程某个事件发生,如中断、终止、挂起等。
- 进程可以接收、忽略、处理信号(但某些信号无法被捕获或忽略,如
SIGKILL
)。 - 信号是由内核、用户、硬件触发的。
- 进程可以使用
kill
命令或kill()
系统调用向其他进程发送信号。
二、常见的 Linux 信号列表
信号编号 | 信号名称 | 默认动作 | 说明 |
---|---|---|---|
1 | SIGHUP | 终止 | 终端关闭、会话结束时发送 |
2 | SIGINT | 终止 | 用户按Ctrl+C终止进程 |
3 | SIGQUIT | 终止 + Dump | Ctrl+\退出进程,生成 core dump |
9 | SIGKILL | 终止 | 强制终止进程,不可捕获/忽略 |
11 | SIGSEGV | 终止 + Dump | 段错误(Segmentation Fault) |
15 | SIGTERM | 终止 | 默认的进程终止信号,可被捕获和忽略 |
18 | SIGCONT | 继续 | 让一个停止的进程继续运行 |
19 | SIGSTOP | 停止 | 强制暂停进程,不可捕获/忽略 |
20 | SIGTSTP | 停止 | Ctrl+Z发送,让进程进入后台 |
SIGKILL
和SIGSTOP
无法被进程捕获或忽略,确保系统可以终止或挂起进程。SIGTERM
是最常用的终止进程信号,可由进程处理或忽略。
在终端运行kill -l
命令, 可查看Linux支持的信号列表:
其中,编号为1 ~ 31的信号为传统UNIX支持的信号,是不可靠信号(非实时的);编号为34 ~ 63的信号是后来扩充的,为可靠信号(实时信号)。
不可靠信号和可靠信号的区别在于前者不支持排队,可能会造成信号丢失,而后者不会。
三、发送信号
3.1 kill
命令
kill
用于向进程发送信号:
kill -SIGNAL PID
kill -9 1234 # 发送 SIGKILL 终止进程 1234
kill -15 5678 # 发送 SIGTERM(默认)终止进程 5678
如果不指定信号,默认发送SIGTERM
:
kill 5678 # 等价于 kill -15 5678
3.2 pkill
和killall
pkill
通过进程名发送信号:
pkill -9 firefox # 强制终止所有名为 firefox 的进程
killall
终止所有匹配名称的进程:
killall -15 python # 发送 SIGTERM 终止所有 Python 进程
3.3 kill()
系统调用
在C语言中,可以使用kill()
发送信号:
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
int main() {
pid_t pid = 1234; // 替换为目标进程 PID
kill(pid, SIGKILL); // 向进程发送 SIGKILL
return 0;
}
3.4 raise()
向自己发送信号
#include <signal.h>
#include <stdio.h>
int main() {
printf("Sending SIGTERM to self...\n");
raise(SIGTERM); // 进程向自己发送 SIGTERM
return 0;
}
3.5 sigqueue()
发送带数据的信号
#include <signal.h>
#include <stdio.h>
int main() {
pid_t pid = 1234; // 目标进程 PID
union sigval value;
value.sival_int = 42; // 传递的数据
sigqueue(pid, SIGTERM, value);
return 0;
}
四、处理信号
进程可以使用signal()
或sigaction()
处理信号。
4.1 signal()
处理信号
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
void handler(int signum) {
printf("Received signal %d\n", signum);
}
int main() {
signal(SIGINT, handler); // 捕获 SIGINT (Ctrl+C)
while (1) {
sleep(1);
}
return 0;
}
运行后,按Ctrl+C
发送SIGINT
,进程不会终止,而是打印Received signal 2
。
4.2 sigaction()
处理信号
sigaction()
提供更强的信号控制功能:
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
void handler(int signum) {
printf("Caught signal %d\n", signum);
}
int main() {
struct sigaction sa;
sa.sa_handler = handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sigaction(SIGINT, &sa, NULL);
while (1) {
sleep(1);
}
return 0;
}
sigaction()
可以替代signal()
,支持更高级的信号处理。
五、屏蔽信号
sigprocmask()
屏蔽信号
可以使用sigprocmask()
屏蔽信号,使进程暂时忽略某些信号:
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
int main() {
sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGINT); // 屏蔽 SIGINT
sigprocmask(SIG_BLOCK, &set, NULL);
printf("SIGINT is blocked. Press Ctrl+C, but nothing happens.\n");
sleep(10);
sigprocmask(SIG_UNBLOCK, &set, NULL);
printf("SIGINT is now unblocked.\n");
while (1) sleep(1);
return 0;
}
SIG_BLOCK
屏蔽信号,SIG_UNBLOCK
解除屏蔽。
六、挂起进程等待信号
6.1 pause()
等待信号
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
void handler(int signum) {
printf("Caught signal %d, exiting...\n", signum);
}
int main() {
signal(SIGINT, handler);
printf("Waiting for signal...\n");
pause(); // 挂起进程,直到接收到信号
return 0;
}
6.2 sigwait()
主动等待信号
#include <signal.h>
#include <stdio.h>
int main() {
sigset_t set;
int signum;
sigemptyset(&set);
sigaddset(&set, SIGINT);
sigprocmask(SIG_BLOCK, &set, NULL);
printf("Waiting for SIGINT...\n");
sigwait(&set, &signum);
printf("Received signal %d\n", signum);
return 0;
}
七、总结
- 信号是进程间通信的重要方式,用于通知进程发生事件,如终止、暂停、继续等。
- 进程可以使用
kill
、raise
、sigqueue
发送信号。 - 进程可以使用
signal()
或sigaction()
处理信号。 - 可以使用
sigprocmask()
屏蔽信号,pause()
或sigwait()
挂起进程等待信号。
掌握信号机制对编写可靠的后台服务、守护进程、异常处理等至关重要!
热门推荐
中国十大营养价值高的水果排行榜!你都喜欢吃哪几种?
改名需要什么充分理由
刹车突然失灵,“直接熄火”和“挂挡前行”哪种更安全?了解一下
刹车失灵后的4种自救方法,第三种老司机都不会!关键时刻能救命、你咋看
如何让人工智能讲课?
如何判断汽车电瓶该换了?万一没电了咋办
志愿填报季的新闻专业:宠儿还是弃子?风评被害还是真不吃香?
掌握关系定位法提升人际交往技巧
公务员被行政拘留对公职影响
从数据看税收助力经济高质量发展
利润表管理费用包括哪些内容?管理费用如何分类?管理费用如何影响企业利润?
房屋租赁合同签订指南:注意事项、仲裁与违约赔偿标准
光伏消纳比例的计算与解析(光伏自发自用消纳计算表)
8月上市公司定增动态:实际募资总额46.23亿元 中曼石油、中再资环募资额居前
分手后适合很快再谈恋爱吗?新旧观点
广东前10强高校排名出炉:中山大学远超华南理工,南科大跻身前5
西蒙斯征服华尔街的利器—— 壁虎式投资法
冷高暖低,看懂色温选对灯具
孕吐是在排斥老公基因吗?
孕期缓解压力技巧大揭秘
钓青鱼用什么小药比较好?黑坑可以用小药,野钓没必要用小药!
旗下梅见陷“辱女”争议,强营销也难补江小白短板?
探秘家庭氧疗,为呼吸健康“氧”护到底
哥咱家有钱了什么梗?热梗背后关于彩礼的社会现实
翡翠种水详解:从老坑种到干青种的全面解析
大学生犯罪对自身的危害:法律后果与社会责任
如何使用YOLOv8进行小麦穗目标检测:从数据准备到模型部署的完整指南
AI市场营销:实现个性化推荐与精准定位
林默,无言的千年风华
如何使用YOLOv8进行实时足球运动员和球检测:计算机视觉教程