15|标准库:信号与操作系统软中断有什么关系?
该思维导图由 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-026 - 疯码这么多限制下,信号处理函数似乎做不到异常恢复。是不是还是高级语言的针对每一段代码的try catch才有用
作者回复: 当信号处理函数执行完毕后,是可以再次回到程序逻辑继续执行的,比如通过 longjmp 等方式。但哪些异常可以恢复、可以被忽略,就要具体看了。本质上来看,信号捕获和 try...catch 这两个概念还是比较独立的。一个与操作系统实现紧密相关(比如 POSIX 标准),另一个则是独立于系统的语言特性。
2022-01-171 - 白凤凰“信号处理程序执行完毕后,若程序未退出,则将程序执行恢复到之前的中断点,即 CPU 会重新执行 idiv 指令。“ 这句话我不太理解,不应该是执行idiv的下一条指令吗?
作者回复: 因为 CPU 执行到 idiv 时发生了异常,而该指令实际上是还没有执行完成的(执行过程中发生了异常)。因此当信号处理函数结束后,还会再次“尝试”去重新执行这个指令。你可以试着去掉代码第 6 行的 exit 函数调用,然后再看看整个程序的执行结果。这个时候是不是会连续多次打印出 “Signal 8 catched!” 呢?
2022-01-1751 - engleflyprint_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-213 - 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