深入 C 语言和程序运行原理
于航
PayPal 技术专家
21121 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 49 讲
深入 C 语言和程序运行原理
15
15
1.0x
00:00/00:00
登录|注册

15|标准库:信号与操作系统软中断有什么关系?

Win32 API
POSIX
保证原子性读写
忽略信号 (SIG_IGN)
默认处理 (SIG_DFL)
宏定义
向程序发送信号
注册信号处理函数
默认或自定义处理程序执行
事件发生时操作系统发送信号
系统调用实例
由软件指令引起
与硬件状态相关
由硬件触发
执行中断服务程序 (ISR)
保存状态
CPU 暂停当前活动
命令行 "kill -9"
sys_kill 系统调用
多线程应用注意事项
保证程序健壮性
信号处理接口
信号是软中断
替代方案
可能产生未定义行为
C标准未规定多线程信号处理
sig_atomic_t 类型
不可重入函数示例
信号处理中函数重入问题
信号类型与处理方式
raise 函数
signal 函数
signal.h 头文件
信号作为软中断
软件中断
硬件中断
中断定义
名称以 "SIG" 前缀
程序运行中特殊情况通知
传递特定消息
操作系统机制
思考题
总结
多线程应用的信号处理
可重入函数
C代码中信号交互
信号与软件中断
信号基本概念
C语言信号处理与操作系统软中断关系

该思维导图由 AI 生成,仅供参考

你好,我是于航。
相信你在第一次学习编程时,也写出过与下面这段类似的代码:
#include <stdio.h>
int main(void) {
int x = 10;
int y = 0;
printf("%d", x / y);
return 0;
}
可以很明显地看到,这里在代码中,我们通过 printf 函数打印出了除法表达式 x / y 的计算结果。但定睛一看,你就会发现:在这个表达式中,除数变量 y 对应的值为 0。因此,程序在运行时便会发生“除零异常”。
当然,你可能会说,这只是我们故意构造的一段带有问题的程序。但在真实场景中,四则运算作为最基本的数学运算,被广泛应用在各类大型 C 项目中。而当参与运算的具体操作数可以被来自于用户的输入影响,且程序实现并没有进行完备的边界条件检查时,类似的运行时异常难免会发生。
除此之外,程序在运行过程中,都会直接或间接地与操作系统,甚至底层硬件进行交互。因此,你可能会遇到下面这几种情况:
程序运行时,由于访问了非法的内存资源,导致出现 “Segmentation Fault” 等异常;
用户想要结束程序,急切地按下了 Ctrl+C / Command+C 键;
计算机底层硬件系统出现故障,导致无法实现某项特定功能;
……
在这些情况下,应用程序应该如何响应?其实,我上面提到的所有问题,都可以通过“信号(Signal)”来解决。今天我们就来看看什么是信号,以及如何在 C 代码中通过标准库提供的相关接口与信号进行交互。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

C语言中的信号处理与操作系统软中断密切相关,通过信号处理函数的设置,程序可以对特定信号做出相应的处理,增强程序的稳定性和可靠性。文章介绍了信号的基本概念、C程序中使用信号处理函数的方法以及信号中断可能对程序运行带来的影响。借助信号,操作系统可以及时通知程序发生的特殊情况,并按照特定方式或系统的默认方式进行处理。在C语言中,可以通过引入标准库头文件signal.h来使用相关的信号处理接口,包括signal函数和raise函数。文章还提到了不可重入函数在信号处理程序中的不当使用可能会给程序的运行带来问题,以及多线程应用中使用信号处理可能产生未定义行为的问题。因此,在多线程应用中,建议避免使用信号处理,而是考虑使用不同操作系统上的API来实现多线程模式下的信号处理过程。总的来看,本文深入介绍了C语言中的信号处理相关内容,对于想要深入了解信号处理的读者具有一定的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入 C 语言和程序运行原理》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(6)

  • 最新
  • 精选
  • shk1230
    “你知道 Linux 中的 sys_kill 系统调用有什么作用吗?常见的命令行操作 “kill -9” 又是什么意思呢?欢迎在评论区告诉我你的理解。” 我的理解:sys_kill是发送SIGKILL信号,程序不可忽略,也不能注册处理函数,保证操系统的控制权。kill -9也是发送这样的信号。

    作者回复: 回答正确!

    2022-03-02
    6
  • 疯码
    这么多限制下,信号处理函数似乎做不到异常恢复。是不是还是高级语言的针对每一段代码的try catch才有用

    作者回复: 当信号处理函数执行完毕后,是可以再次回到程序逻辑继续执行的,比如通过 longjmp 等方式。但哪些异常可以恢复、可以被忽略,就要具体看了。本质上来看,信号捕获和 try...catch 这两个概念还是比较独立的。一个与操作系统实现紧密相关(比如 POSIX 标准),另一个则是独立于系统的语言特性。

    2022-01-17
    1
  • 白凤凰
    “信号处理程序执行完毕后,若程序未退出,则将程序执行恢复到之前的中断点,即 CPU 会重新执行 idiv 指令。“ 这句话我不太理解,不应该是执行idiv的下一条指令吗?

    作者回复: 因为 CPU 执行到 idiv 时发生了异常,而该指令实际上是还没有执行完成的(执行过程中发生了异常)。因此当信号处理函数结束后,还会再次“尝试”去重新执行这个指令。你可以试着去掉代码第 6 行的 exit 函数调用,然后再看看整个程序的执行结果。这个时候是不是会连续多次打印出 “Signal 8 catched!” 呢?

    2022-01-17
    5
    1
  • englefly
    print_with_exp 的那段代码怎么编译呢? 编译命令 gcc sigill.c -o ill -fPIE 得到错误如下: /usr/bin/ld: /tmp/ccdPmLJC.o: relocation R_X86_64_32S against `.bss' can not be used when making a PIE object; recompile with -fPIE collect2: error: ld returned 1 exit status

    作者回复: 直接用 “gcc sigill.c -o ill” 就可以哈。

    2022-01-21
    3
  • ZR2021
    原来是发现异常指令后主动将控制权交给操作系统,操作系统发信号给进程做相应处理的,以前一直不明白我不调用任何系统调用的时候操作系统怎么就发了个信号过来,不过有个问题想请教下老师,哪些异常指令会将控制权交给操作系统的,这些异常应该是跟具体平台如x86有关的吧,而不是和操作系统相关

    作者回复: “哪些异常指令会将控制权交给操作系统”,这个我倒是没有系统总结过。一般规律是:只要是影响了程序正常执行的指令错误,操作系统都会以“信号”的方式通知应用程序。异常的发生与具体平台的指令有关,但信号是由 POSIX 标准制定的,具体的映射关系,由操作系统控制(比如硬件发生的除零异常会对应到 SIGFPE,等等)。

    2022-01-18
  • 小杰
    sys_kill - send a signal to a process。Kill -9 4124,Send the kill signal to kill 4129 processes https://linuxhint.com/linux-kill-command/ https://manpages.debian.org/jessie/linux-manual-3.16/sys_kill.9.en.html 这里有比较详细的答案
    2022-05-06
收起评论
显示
设置
留言
6
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部