首页 > 其他分享 >信号基础

信号基础

时间:2023-05-07 14:23:33浏览次数:22  
标签:SIGRTMAX 异步 中断 基础 信号 进程 SIGRTMIN

一、概念

  1. 信号是事件发生时对进程的通知机制,也可以把它称为软件中断。信号与硬件中断的相似之处在于能够打断程序当前执行的正常流程,其实是在软件层次上对中断机制的一种模拟。大多数情况下,是无法预测信号达到的准确时间,所以,信号提供了一种处理异步事件的方法。
  2. 信号的目的是用来通信的。一个具有合适权限的进程能够向另一个进程发送信号,信号的这一用法可作为一种同步技术,甚至是进程间通信(IPC)的原始形式。
  3. 信号通常是发送给对应的进程,当信号到达后,该进程需要做出相应的处理措施,通常进程会视具体信号执行操作。比如:忽略信号、捕获信号、执行系统默认操作(大多数为终止该进程)。
  4. 信号是异步的。信号是异步事件的经典实例,产生信号的事件对进程而言是随机出现的,进程无法预测该事件产生的准确时间,进程不能够通过简单地测试一个变量或使用系统调用来判断是否产生了一个信号,这就如同硬件中断事件,程序是无法得知中断事件产生的具体时间,只有当产生中断事件时,才会告知程序、然后打断当前程序的正常执行流程、跳转去执行中断服务函数,这就是异步处理方式。
  5. 信号本质上是 int 类型数字编号。
    1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
    6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
    11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
    16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
    21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
    26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
    31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
    38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
    43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
    48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
    53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
    58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
    63) SIGRTMAX-1 64) SIGRTMAX

二、信号分类

  1. 从可靠性方面将信号分为可靠信号与不可靠信号。Linux下的不可靠信号问题主要指的是信号可能丢失(处理信号时又来了新的信号,则导致信号丢失),在 Linux 系统下,信号值小于 SIGRTMIN(34)的信号都是不可靠信号。
  2. 从实时性方面将信号分为实时信号与非实时信号。非实时信号都不支持排队,都是不可靠信号;实时信号都支持排队,都是可靠信号。实时信号保证了发送的多个信号都能被接收,实时信号是 POSIX 标准的一部分,可用于应用进程。一般也把非实时信号(不可靠信号)称为标准信号。

三、常见信号

  1. SIGINT: 当用户在终端按下中断字符(通常是 CTRL + C),内核将发送 SIGINT 信号给前台进程组中的每一个进程。该信号的系统默认操作是终止进程的运行。
  2. SIGQUIT:当用户在终端按下退出字符(通常是 CTRL + \),内核将发送 SIGQUIT 信号给前台进程组中的每一个进程。该信号的系统默认操作是终止进程的运行、并生成可用于调试的核心转储文件。进程如果陷入无限循环、或不再响应时,使用 SIGQUIT 信号就很合适。
  3. SIGKILL:此信号为“必杀(sure kill)”信号,用于杀死进程的终极办法,此信号无法被进程阻塞、忽略或者捕获,故而“一击必杀”,总能终止进程。
  4. SIGALRM:与系统调用 alarm()或 setitimer()有关,应用程序中可以调用 alarm()或 setitimer()函数来设置一个定时器,当定时器定时时间到,那么内核将会发送 SIGALRM 信号给该应用程序。
  5. SIGCONT:将该信号发送给已停止的进程,进程将会恢复运行。当进程接收到此信号时并不处于停止状态,系统默认操作是忽略该信号,但如果进程处于停止状态,则系统默认操作是使该进程继续运行。
  6. SIGSTOP:这是一个“必停”信号,用于停止进程(注意停止不是终止,停止只是暂停运行、进程并没有终止),应用程序无法将该信号忽略或者捕获,故而总能停止进程。
  7. SIGPOLL/SIGIO:用于提示一个异步 IO 事件的发生,譬如应用程序打开的文件描述符发生了 I/O 事件时,内核会向应用程序发送 SIGIO 信号。

四、进程对信号的处理

标签:SIGRTMAX,异步,中断,基础,信号,进程,SIGRTMIN
From: https://www.cnblogs.com/bite-an-orange/p/Signal.html

相关文章

  • Spring Cloud的基础信息
    SpringCloud是什么? SpringCloud是一系列框架的有序集合,它利用SpringBoot的开发便利性简化了分布式系统的开发,比如服务发现、服务网关、服务路由、链路追踪等。SpringCloud并不重复造轮子,而是将市面上开发得比较好的模块集成进去,进行封装,从而减少了各模块的开发成本。换句......
  • pytorch基础学习.md
    pytorch入门学习来源:https://www.bilibili.com/video/BV1hE411t7RN安装#1.已安装nvidia相关驱动#2.安装python-pytorch-cudansfoxer@ns-pc~/Temp>yay-Qipython-pytorch-cudanumactl基础使用DataSet数据集加载继承DataSet类,并实现get_item_fromtorch.utils......
  • 财务基础知识:单式记账法和复式记账法
    单式记账法:单式记账法从字面即可理解,这是一种比较单一的记账法,与之相对的则是复式记账法。单式记账法的主要特点:属于一个简单的记账法而且是不完整的,它主要是记公司的现金收入的账目。简单点说就是会记录一下公司的收入多少,然后公司与银行以及欠人家多少钱这样的数据。公司有......
  • Book-Linux 系统编程-41章 共享库基础
    Book-Linux系统编程-41章共享库基础共享库是一种将库函数打包成一个单元使之能够在运行时被多个进程共享的技术。这种技术能够节省磁盘空间和RAM。41.1目标库构建程序的一种方式是简单地将每一个源文件编译成目标文件,然后将这些目标文件链接在一起组成一个可执行程序,如下所......
  • 第二章:用电信号传输TCP/IP数据-02-连接:connect()
    一、连接是什么意思话说网线一直插着,网络一直连着,网线中随时都有信号流过,那这个“连接”是连接什么呢?可以类比人与人之间的联系,满大街都是人,身边随时有人走过,我们算是跟任何人有联系吗?当然没有!怎么才算有联系?先要双方有交往意愿,然后互换个名片,这才算联系上了。哪天一方找到另......
  • Qt中信号与槽
    1.什么是信号:信号的种类很多,不同的控件触发不同的特定信号例如button的信号:(在父类中可以找到)信号与槽同时是通过关联使用的。  2.什么是槽?槽:用于关联某一个控件的信号,信号触发的时候将会执行槽函数(槽函数的关联分为手动关联和自动关联)槽的自动关联;在前面板选中对应的控......
  • numpy的基础运算
    1.矩阵相减,矩阵元素平方,矩阵元素比较大小: 2.np.dot的矩阵运算: 3.求总数据的和,每一列的求和,每一行的求和: 4.求总数据的最小值,每一列的最小值,每一行的最小值: 5.求总数居的最大值,每一列的最大值,每一行的最大值: ......
  • 信号量
    有几个线程就有几个除互斥信号之外的信号量,每个线程等待自己的信号量有位置,并最后给其他信号量位置。初始时,生产者的值非0,消费者的值为0。/*#include<semaphore.h>intsem_init(sem_t*sem,intpshared,unsignedintvalue);参数:......
  • Golang基础--加锁与原子操作
    前言在实际项目开发中,有时会面临同一时刻将多个goroutine作用于同一个对象的情况,此时,他们之间会发生冲突,这种情况称为数据竞态问题。例如:packagemainimport("fmt""time")varcountintfuncmain(){goCountPlus(10000)goCountPlus(10000)......
  • go基础
    第一段代码packagemain//声明文件所在的包,每个go文件必须有归属的包import"fmpt"//引入程序需要用的包,为了使用包下的函数,比如printlnfuncmain(){fmt.Println("Hellogolang!")//控制台打印输出一句话,双引号内会原样输出}对源文件test.go进行编译:使用go......