当前位置:网站首页>C语言中信号函数(signal)的使用

C语言中信号函数(signal)的使用

2022-08-09 11:03:00 XV_

先来简单谈谈C语言中的信号(signal)

首先,signal是C语言库中的函数,它实际上是软中断,也就是软件发出的终端,本质来说,类似于int n

对于接收到该软中断信号的进程,就会停下手头的工作,转而去执行信号处理程序 signal handler

对于这一点,是与硬件中断的方式类似的。与硬件中断类比学习会更容易!

因此,我们需要知道的是

  • 有哪些可用的软中断:就像硬件的除法零中断、溢出中断、外设中断…
  • 软中断处理程序有哪些:就像中断服务程序(位置信息在idt、ivt)
    • 默认的软中断服务程序:系统启动的时候就初始化默认的中断服务程序
    • 用户自定义软中断服务程序:操作系统可自定义中断服务程序

以及需要明白

  • 中断何时被触发(触发条件)
  • 谁发出的中断
  • 谁接收的中断

以上,都是抽象层次的理解,我们缕一缕过程

  1. 进程x执行
  2. 进程x触发中断 --> 发出软中断
  3. 进程y接收到中断,进程x该干啥干啥
  4. 进程y停止当前的任务,转而执行中断服务程序
  5. 执行完成,进程y继续执行自己的程序

至于进程x和y,可以的

  • 同一进程
  • 两个进程
    • 父进程与子进程
    • 至于两个独立进程,先暂时不管,想做到这点至少得让二者能够通信

好,整体框架梳理好了,我们慢慢说。

有哪些信号

All signals in c/c++

上面的参考链接给出了所有的信号,现在我们简单举例说明。

SignalValueDescription
SIGCHLD17Child status has changed (POSIX). Signal sent to parent process whenever one of its child processes terminates or stops.See the YoLinux.com Fork, exec, wait, waitpid tutorial
SIGCHLD信号:父进程子进程

请看我的另一篇文章:信号量SIGCHLD的使用,如何让父进程得知子进程执行结束,如何让父进程区分多个子进程的结束

信号处理函数

参考:
[1] Signals in C language
[2] How to use signal handlers in C language?

信号处理函数有两类

  • 系统自带的处理函数
  • 用户自定义函数

与底层硬件中断是类似的,中断向量表是自带的,也允许用户自定义。

关于中断的默认处理以及自定义处理,链接也有了。

谁发出?谁接收?

  • 发出者:操作系统,或者某进程
  • 接收者:某进程

至于细节,取决于你使用了哪个信号。每个信号的发出和接收动作和对象,以及默认的处理函数,都是规定好了的。

如何执行?

这个不再提了…就那么几个套路,很容易。

需要特别说明的是,如果进程1接收其他进程的信号X,在进程1执行信号x处理函数之前,如果多个信号x都发给了进程1,那么,这些信号可能被合并,进程1只执行1次信号处理函数。这可能的原因很多,比如操作系统很忙…


下面这篇参考链接我还没有处理:

Handling multiple SIGCHLD

原网站

版权声明
本文为[XV_]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_42929607/article/details/116403858