
Linux —— 信号初识
内核:内核会因各种事件自动发送信号给进程,比如进程执行非法指令、访问无效内存地址、用户按下Ctrl+C终止进程等。 进程:进程可以通过系统调用kill()向自己或其他进程发送信号。 终端:用户在终端上操作时,比如按下Ctrl+C或Ctrl+Z,内核会向前台进程发送信号。 硬件:虽然信号主要由软件生成,但某些硬件异常也可能间接触发信号。 通知事件:告知进程某些状态变化或事件的发生,例如子进程结束、定时器到期等。 控制进程行为:可以请求进程采取特定动作,比如终止、暂停、继续执行或调整优先级。 默认动作:比如SIGINT通常会导致进程终止。 忽略:进程可以选择不处理某些信号。 自定义处理:通过signal()或sigaction()系统调用指定信号的处理方式。
发布日期:2025-04-06 07:46:32
浏览次数:7
分类:精选文章
本文共 1732 字,大约阅读时间需要 5 分钟。
Linux信号——初识
Linux操作系统中的信号是内核与进程之间进行异步通信的一种机制。它允许系统或进程向其他进程发送简短的控制信息,以通知事件发生或要求进程采取某种行动。信号是软中断,由软件生成,而非硬件触发。
信号的来源
信号可以来自多个来源:
信号的目的
信号主要有以下几种用途:
信号的处理方式
每个信号都有其默认行为,用户可以选择忽略或自定义处理方式:
信号掩码与阻塞
进程可以设置信号掩码,选择性地阻塞某些信号的传递,以控制进程的行为。
常见信号
以下是几个常用的信号类型及其用途:
- SIGHUP (1):挂起信号,通常在终端线路挂断时发送。
- SIGINT (2):中断信号,用户按下Ctrl+C时发送。
- SIGQUIT (3):退出信号,通常伴随核心转储。
- SIGKILL (9):强制终止信号,无法被忽略或阻塞。
- SIGTERM (15):终止信号,用于请求进程正常终止。
- SIGSEGV (11):段错误信号,指示内存访问错误。
- SIGALRM (14):闹钟信号,与定时器相关。
- SIGCHLD (17):子进程状态改变信号,用于监控子进程。
- SIGSTOP (19):停止信号,立即停止进程。
- SIGCONT (18):继续执行信号,恢复被停止的进程。
- SIGUSR1/SIGUSR2 (10, 31):用户自定义信号,供应用程序使用。
通过kill -l命令可以查看所有支持的信号类型。
测试信号
编写一个简单的C程序,例如:
#include#include using namespace std;int main(){ while(true){ cout << "running process..." << endl; sleep(1); }}
编译并运行,按下Ctrl+C或其他信号键组合来观察程序的反应。
signal函数
为了验证Ctrl+C和信号2是否为同一事件,可以编写一个信号处理函数。例如:
#include#include #include using namespace std;void signal_handler(int signum){ cout << "Caught SIGINT, ignoring..." << endl; exit(0);}int main(){ signal(SIGINT, signal_handler); while(true){ cout << "running process..." << endl; sleep(1); }}
编译并运行,按下Ctrl+C验证。
后台程序管理
使用ampersand(&)将程序后台运行:
./your_program &
前台程序可以通过fg命令转为后台,将终点步回前台。
中断向量表
中断向量表是计算机系统中关键的数据结构,存储各中断服务程序的入口地址。它决定了如何高效响应外部事件,如键盘输入、定时器到期等。
在实际工作中,理解信号机制是编写稳定、高效系统程序的核心技能。掌握信号、进程间通信和系统调用的使用,可以让程序更健壮、更具韧性。
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2025年04月20日 19时00分45秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
LeetCode – Refresh – 4sum
2023-01-31
leetCode 字符串反转
2023-01-31
LeetCode(229):Majority Element ||
2023-01-31
LeetCode--020--括号匹配
2023-01-31
Leetcode-966 Vowel Spellchecker(元音拼写检查器)
2023-01-31
LeetCode111.二叉树最小深度
2023-01-31
leetcode23-合并K个升序链表
2023-01-31
LeetCode268.缺失数字
2023-01-31
Leetcode: Spiral Matrix II
2023-01-31
LeetCode: String to Integer (atoi)
2023-01-31
LeetCode:Restore IP Addresses
2023-01-31
LeetCode——Unique Paths
2023-01-31
LeetCode二叉树从上至下路径问题总结(112.113.437.129)
2023-01-31
LeetCode地平线专场——第308场周赛题解
2023-01-31
LeetCode数据库题目汇总二(附答案)
2023-01-31
leetcode题解173-二叉搜索树迭代器
2023-01-31
leetcode题解191-位1的个数
2023-01-31
leetcode题解20-有效的括号
2023-01-31
leetcode题解200-岛屿数量
2023-01-31
leetcode题解206-反转链表
2023-01-31