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

先来简单谈谈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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/384601.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UNIX哲学

参考: 对比Linux与Windows 使用Linux想要做某些事情的时候,就拆开想,想想我需要哪些功能,需要哪些工具,依次怎么执行,然后用管道建立连接,让数据依次流过不同的工具,从而得到最终结果…

fork创建多个子进程

references: [1] how to create two processes from a single Parent [2] fork() in C [3] linux中fork同时创建多个子进程的方法 fork的本质,就是复制,把当前进程复制一份,然后两个进程并发地执行fork后面的语句,区别就是&#x…

wait系统调用

reference:Wait System Call in C 只强调几点,剩下的直接看参考链接内容就好了,不是偷懒,而是里面内容写的很好了,没必要再写一遍了,这种东西就是单纯的系统调用而已,理解了功能,就完事了&#…

Linux进程间通信:共享内存与管道

references: [1] IPC through shared memory [2] Inter Process Communication (IPC) [3] https://www.geeksforgeeks.org/pipe-system-call/ [4] watch command in Linux with Examples 参考链接1和2是介绍了共享内存IPC的简单原理和相关系统调用的使用参考链接3是介绍了管道通…

find command基本使用

find命令通常用于根据文件名查找文件,这是最基本用法。 find [path] -name/-iname [filename] path写要查找的路径,自动递归查找filename写文件名,可以使用通配符*还有其他什么的表达式 具体细节请man find查阅文档。

正则表达式特别需要注意的点:“空“字符的匹配

在正则表达式中,[...]代表1个字符,不管里面有多少字符,最终这个东西的结果都是1个字符。 对于表达式[^a]表达的匹配除了a之外的字符,并且是1个字符。 需要注意的是,有些特殊字符是不会被匹配的。 我们看一个示例&am…

vim多列操作--插入/删除

插入 How to insert text at beginning of a multi-line selection in vi/VimVim Commands 删除 ctrl v使用上下左右键选中一片区域按d删除

vim进行行内某部分的复制剪切粘贴

ctrl v使用方向键选中你要复制的部分 按d(剪切)或者按y(复制)再移动到你的目标位置,按p粘贴(在正常模式下才行,如果不是,先按esc) 这个过程与你操作word文档的复制粘贴…

函数调用堆栈

基于孟宁老师的Linux内核分析 1 int g(int x){ 2 int y x 3;3 return y;4 }5 6 int f(int x){7 int z x 10;8 return g(z);9 }10 11 int main(){12 int a f(8) 1;13 return 0;14…

gdb调试的几点提示(1)

GDB debugger Examining Memory Continuing and Stepping How to translate a virtual memory address to a physical address? s和n是C语言的下一步 si和ni是汇编语言下一步 gdb能够查看的都是虚拟地址,不能查看物理地址,应用程序都不能查看物理地址…

C语言读取文件

C语言一次性读取文件 C - File I/O C library function - fread() 需要注意的点 fgets函数,一次只能读取一行,并且在结尾自动添加\0fread函数,可以读取很多内容,但是不会添加\0需要手动完成,具体看[参考1]

Vivado提高综合和实现的速度

让计算机的资源尽可能给vivado,综合、实现的时候修改一个参数 jobs改为你的计算机的最大值,我的计算机是12核的。 速度会快很多!

安装Ubuntu RISC V toolchain失败(网速、git配置原因)

git获取大容量工程出错:RPC failed; curl GnuTLS recv error : Decryption has failed. error: RPC failed; curl 56 GnuTLS recv error (-54): Error in the pull function.fatal: The remote end 官方GitHub仓库 gitee镜像仓库 如果网速不够&#xff0…

Linux环境变量 set env export区别

参考链接 How to Set Environment Variables in Linux set 他能够显示当前shell的环境变量 它针对的对象是当前shell,如果关闭了就没了! 直接使用set --help查看就可以。 env 显示当前用户的环境变量,针对的当前登录的用户 export 它能…

VirtualBox Ubuntu个人配置

注意这里VT-x启用,除了在BIOS启用CPU虚拟化,还得在命令行设置一次才可以勾选。 F:\>cd F:\VirtualBox # 进入VirtualBox安装目录F:\VirtualBox>VBoxManage.exe list vms # 查找所有虚拟机 "rhel64" {240f96d8-6535-431d-892e-b70f3dc4…

Ubuntu停止维护版本的软件源配置和系统升级方法

这里以Ubuntu 20.10版本为例(当前是2022.2.14,该版本已经停止维护),我们现在需要正常使用该版本,并且期待升级到21.10版本,我们需要 配置正确是软件源升级该版本 配置正确的软件源 配置国内镜像源 我们…

优质学习内容(自用)

Verilog Verilog教程HDLBits — Verilog Practice中科大Verilog OJVerilog语法和典型电路verilog中if与case语句不完整产生锁存器的问题 Chisel chisel offcial website playground OpenXiangShan Chisel playgroundchisel IntelliJ IDEA playground library Maven libr…

diff and colordiff on Ubuntu

在Ubuntu中使用diff来对比文件差异,但是不是很好用,尤其是着色方面,用起来很麻烦,因此可以安装colordiff。 我们有两个文件file1和file2,使用命令 colordiff file1 file2 -y -B -W 140就可以对比文件差异&#xff0c…

基于IntelliJ IDEA和Ubuntu的Chisel开发环境搭建

注意!本教程不是详细解说!只说思路,其余请自己查阅!不适合小白用户。 环境 Ubuntu 20.04 LTSIntelliJ IDEA 过程 在Ubuntu下安装IDEA,具体版本号的使用,请自行查阅官网安装IDEA插件,EasySoc…

verilator编译 更新文件的规则

本文请读者【直接关闭】,我后面的实践结果似乎和本文的实践结果不一样,真是见鬼了!我不知道发生了什么,还没有来得及进一步校验! 在其他文件不变的前提下,如果即将生成的mk文件和已有的mk文件不一样&#…