首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【Linux】:进程信号(信号保存 & 信号处理)

被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作 注意:阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作 2....信号未决:信号产生后,在未被处理之前,处于未决状态。...bit 置位,表示 该信号集的有效信号包括系统支持的所有信号 注意 : 在使用 sigset_t 类型的变量之前,一定要调用 sigemptyset 或 sigfillset 做初始化,使信号集处于确定的状态...初始化 sigset_t 变量之后就可以在调用 sigaddset 和 sigdelset 在该信号集中添加或删除某种有效信号。 这四个函数都是成功返回0,出错返回-1。...上面函数使用分析 如果 oset 是非空指针, 则读取进程的当前信号屏蔽字通过oset参数传出 如果 set 是非空指针, 则更改进程的信号屏蔽字, 参数 how 指示如何更改。

13410

linux系统编程之信号(三):信号的阻塞与未决

被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作。注意,阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作。...信号在内核中的表示可以看作是这样的: ? 每个信号都有两个标志位分别表示阻塞和未决,还有一个函数指针表示处理动作。信号产生时,内核在进程控制块中设置该信号的未决标志,直到信号递达才清除该标志。...注意,在使用sigset_t类型的变量之前,一定要调用sigemptyset或sigfillset做初始化,使信号集处于确定的状态。...初始化sigset_t变量之后就可以在调用sigaddset和sigdelset在该信号集中添加或删除某种有效信号。这四个函数都是成功返回0,出错返回-1。...于是设置了一个标志位flag,即把前面说的4行代码补上,则前面的输出是一样的,但在主函数中再次解除阻塞后,按下ctrl+c,让人惊喜的是2号信号顺利递达,如下: ^Crecv a sig=2 0000000000000000000000000000000000000000000000000000000000000000

2.3K00
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【linux学习指南】详解Linux进程信号保存

    被阻塞的信号产⽣时将保持在未决状态,直到进程解除对此信号的阻塞,才执⾏递达的动作. 注意,阻塞和忽略是不同的,只要信号被阻塞就不会递达,⽽忽略是在递达之后可选的⼀种处理动作。...信号产⽣时,内核在进程控制块中设置该信号的未决标志,直到信号递达才清除该标志。在上图的例⼦中,SIGHUP信号未阻塞也未产⽣过,当它递达时执⾏默认处理动作。...信号集操作函数 sigset_t类型对于每种信号⽤⼀个bit表⽰“有效”或“⽆效”状态,⾄于这个类型内部如何存储这些。...注意,在使⽤sigset_t类型的变量之前,⼀定要调⽤sigemptyset或sigfillset做初始化,使信号集处于确定的状态。...初始化sigset_t变量之后就可以在调⽤sigaddset和sigdelset在该信号集中添加或删除某种有效信号。 这四个函数都是成功返回0,出错返回-1。

    10710

    【linux】信号的保存和递达处理

    从而在递达后执行处理方法。         所以我们知道,为什么进程可以识别信号呢?原来是因为程序员在设计进程的时候,已经为进程设计好了这三种结构,从而去识别信号!...当然在信号递达前,会将pending中该信号对应的比特位由1变为0,再去执行。        ...(因为该信号被递达前,会将pending中对应的那一位由1改为0),若结束递达后,同类型仍发送,则会继续重复上面的动作。...但若结束递达后,同类型的信号没有发送了,进程就只会再捕捉一次,将pending中的1改为0。递达后则继续检其他信号进行递达。        ...---- 4.2 可重入函数和不可重入函数         举例说明:          在main执行流中,没有头结点的单链表进行头插,如上图所示:在执行到第一步时,此时被信号中断,结果导致main

    18820

    一文搞懂Linux信号【下】

    hander数组 在进程的task_struct结构体中,存在着一个存放sighander_t*类型的指针数组。...执行完毕后,返回内核态继续干其他工作。 ④当进程把所有只能在内核态中运行的操作,全部完成后,返回用户态执行。 操作信号集 我们的信号位图又称信号集,分为pending信号集和block信号集。...在使用sigset_ t类型的变量之前,一定要调用sigemptyset 或sigfillset 做初始化,使信号集处于确定的状态。...初始化sigset_t变量之后就可以在调用sigaddset和sigdelset在该信号集中添加或删除某种有效信号。 这四个函数都是成功返回0,出错返回-1。...2.其它操作函数 调用函数sigprocmask可以读取或更改进程的信号屏蔽字(block)。

    12610

    Linux进程信号【信号保存】

    ,忽略动作则是将 1 强转为函数指针类型,分别对应 handler 函数指针数组表中的 0、1 下标位置;除此之外,还有一个 错误 SIG_ERR 表示执行动作为 出错 简单对这三张表作一个总结,task_struct...,失败返回 -1 至于参数,非常简单,无非就是 待操作的信号集变量、待操作的比特位 注意: 在创建 信号集 sigset_t 类型后,需要使用 sigemptyset 或 sigfillset 函数进行初始化...当前进程的 pending 表中的 2 号信号位被置为 1,表示该信号属于 未决 状态,并且在五秒之后,阻塞结束,信号递达,进程终止 疑问:当阻塞解除后,信号递达,应该看见 pending 表中对应位置的值由...无法 递达,始终属于 未决 状态,当阻塞解除后,信号可以 递达,信号处理之后,未决 表中不再保存信号相关信息,因为已经处理了 综上,信号在发出后,在处理前,都是保存在 未决表 中的 注意: 针对信号的...,一定要先初始化 信号在被解除 阻塞状态 后,很快就会 递达 了 关于信号何时递达、以及递达后的处理动作,在下一篇文章中揭晓 以上关于 信号、信号集 的操作都是在进程中进行的,不影响操作系统 ----

    21020

    初识Linux · 信号保存

    前言: 前文我们已经介绍了信号产生,在时间的学习线上,信号的学习分为预备知识,信号产生,信号保存,信号处理,本文我们学习信号保存,在前言部分,我们介绍几个信号保存中的概念。...对于信号产生之后,在递达的这个过程,成为未决,就像老师给你布置了作业,你接受到了做作业的这个信号,但是因为贪玩,不想做,这个状态,就是未决。...两个位图 + 一个函数指针数 == 让进程接收到信号。 这里需要注意,忽略是递达之后的一种可选动作,阻塞是信号一旦被阻塞就不会递达。所以被阻塞的信号一直处于未决的状态,直到解除了阻塞状态。...再介绍几个函数: 对于函数sigpending来说,它的参数set是一个输出型参数,获取当前pending位图。 对于函数sigprocmask的参数来说: how:指定如何更改当前的信号屏蔽字。...set:指向一个 sigset_t 类型的变量,该变量包含要更改的信号集。如果 set 是 NULL,则不修改信号屏蔽字,但 oldset 仍然会被设置为当前的信号屏蔽字。

    6010

    【Linux】进程信号(中)

    1中运行可执行程序,在终端2中发送2号信号干掉进程 ---- 当干掉进程后,并没有发现以pid结尾的文件 说明使用Term类型的信号,干掉进程后,不发生核心转储 ---- 8号信号 Core,浮点数异常...即解除阻塞,写完作业即递达 ---- 5.阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后的可选的一种处理工作 同样有一个老师,布置作业后,你记录下来了,可是这个老师平时不查作业,所以直接把这个作业划掉...运行可执行程序后,使用2号信号可终止进程 ---- ---- 把1强制转化成函数指针类型 即忽略信号 对2号信号做忽略 ---- 忽略信号,所以对其做什么动作都没有用了 4.sigset_t...bit置位,表示 该信号集的有效信号包括系统支持的所有信号 ---- 注意,在使用sigset_ t类型的变量之前,一定要调 用sigemptyset或sigfillset做初始化,使信号集处于确定的状态...初始化sigset_t变量之后就可以在调用sigaddset和sigdelset在该信号集中添加或删除某种有效信号 sigprocmask 读取/更改进程的信号屏蔽字,即可以更改block这张位图 int

    21430

    Linux进程信号详解【下】

    ✈️信号集操作函数 sigset_t类型接口   有了sigset_t类型我是是否可以直接操作进程中的信号位图呢?...注意:在使用sigset_ t类型的变量之前,一定要调用sigemptyset或sigfillset做初始化,使信号集处于确定的状态。...初始化sigset_t变量之后就可以在调用sigaddset和sigdelset在该信号集中添加或删除某种有效信号。 这四个函数都是 成功返回0,出错返回-1。...简单来说,就是在head节点后插入一个新节点,但是在插入过程中需要从用户态转内核态,而前面说了,进程在内核态的时候会顺便检查信号,这时刚好收到信号,执行自定义捕捉,而自定义捕捉也是在head后插入一个节点...handler完成后,main函数依旧在刚才插入那步,最后head = p,使得头结点指向第一个被插入的节点,而自定义捕捉方法内插入的节点就会丢失。

    9610

    【Linux】进程信号

    6.4 信号集操作函数   有了信号的操作类型——信号集sigset_t之后,我们就可以通过它对pending表和block表进行操作,函数如下: 1) 初始化sigset_t信号集函数 int sigemptyset...注意,在使⽤sigset_ t类型的变量之前,⼀定要调⽤sigemptyset或sigfillset做初始化,使信号集处于确定的状态。...初始化sigset_t变量之后就可以在调⽤sigaddset和sigdelset在该信号集中添加或删除某种有效信号。 这四个函数都是成功返回0,出错返回-1。...信号捕捉 如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号。...当前正在执行main 函数,这时发生中断或异常切换到内核态。 在中断处理完毕后要返回用户态的 main 函数之前检查到有信号 SIGQUIT 递达。

    11110

    【Linux】信号>信号产生&&信号处理&&信号保存&&信号详解

    信号产生时,内核在进程控制块中设置该信号的未决标志,直到信号递达才清除该标志。...注意,在使用sigset_ t类型的变量之前,一定要调用sigemptyset或sigfillset做初始化,使信号集处于确定的状态。...初始化sigset_t变量之后就可以在调用sigaddset和sigdelset在该信号集中添加或删除某种有效号 这四个函数都是成功返回0,出错返回-1。...sigismember是一个布尔函数,用于判断一个信号集的有效信号中是否包含某种信号,若包含则返回1,不包含则返回0,出错返回-1 3.4.1 sigprocmask 调用函数sigprocmask可以读取或更改进程的信号屏蔽字...当前正在执行main函数,这时发生中断或异常切换到内核态。在中断处理完毕后要返回用户态的main函数之前检查到有信号SIGQUIT递达。

    18310

    【Linux进程信号】Linux信号机制深度解析:保存与处理技巧

    ,直到进程解除对此信号的阻塞,才执行递达的动作 注意:阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作 在内核中的表示 在Linux内核中,信号的保存主要依赖于三种数据结构...信号集操作函数 信号集操作函数用于处理与信号集(sigset_t类型)相关的操作。...这些函数允许用户初始化信号集、添加或删除信号、检查信号是否存在于信号集中,以及修改进程的信号屏蔽字 sigprocmask()函数: 读取或更改进程的信号屏蔽字(阻塞信号集) 返回值:若成功则为...换句话说,这种函数在执行的任何时刻都可以被中断,然后在中断点恢复执行而不会导致错误 main函数调用 insert函数向一个链表head中插入节点node1,插入操作分为两步,刚做完第一步的 时候,...在处理函数中,父进程使用waitpid()函数来回收子进程的资源 随着我们对Linux中信号保存与处理机制的深入探讨,我们不难发现,信号不仅是进程间通信的一种重要手段,更是Linux操作系统内核提供的一种强大而灵活的控制机制

    16310

    Linux系统-进程信号

    只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作 2、在内核中的表示 信号在内核中的表示示意图: 解释: 每个信号都有两个标志位分别表示阻塞(block)和未决(pending...信号产生时,内核在进程控制块中设置该信号的未决标志,直到信号递达才清除该标志 在上图,SIGHUP信号未阻塞也未产生过,当它递达时执行默认处理动作;SIGINT信号产生过,但正在被阻塞,所以暂时不能递达...置位,表示 该信号集的有效信号包括系统支持的所有信号 注意: 在使用sigset_ t类型的变量之前,一定要调用sigemptyset或sigfillset做初始化,使信号集处于确定的状态...初始化sigset_t变量之后就可以在调用sigaddset和sigdelset在该信号集中添加或删除某种有效信这四个函数都是成功返回0,出错返回-1 sigismember是一个布尔函数,用于判断一个信号集的有效信号中是否包含某种信号...当前正在执行main函数,这时发生中断或异常或者系统调用切换到内核态 在中断或者系统调用处理完毕后要返回用户态的main函数之前检查到有信号SIGQUIT递达 内核决定返回用户态后执行sighandler

    3.5K10

    【Linux】信号的保存

    注意,阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作 阻塞,未决和抵达 接下来我们就来介绍三张表,这三张表就能实现阻塞,未决和抵达: 在进程的内核数据结构中会维护三张表...hanlder表是函数指针数组。handler表中的下标是信号编号,内容是收到对应信号会执行的方法。...因此,未决和阻塞标志可以用相同的数据类型sigset_t来存储,sigset_t称为信号集 这个类型可以表示每个信号的“有效”或“无效”状态,在阻塞信号集中“有效”和“无效”的含义是该信号是否被阻塞,而在未决信号集中...-> bits[i]:j该数字中的第几位 sigset_t是Linux操作系统提供的一个用户级数据类型,禁止用户直接修改位图!!!...会处在pending未决中!!! 并且我们发现当cnt变为0时解除了对2号信号的阻塞,这时候进程就退出了,因为2号信号解除阻塞后,就会执行2号信号的对应动作 — 终止!!!

    9910

    【Linux】————信号

    因此,未决和阻塞标志可以用相同的数据类型sigset_t来存储,sigset_t称为信号集,这个类型可以表示每个信号的“有效”或“无效”状态,在阻塞信号集中“有效”和“无效”的含义是该信号是否被阻塞,而在未决信号集中...内核如何实现信号的捕捉 如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号。...在中断处理完毕后要返回用户态的main函数之前检查到有信号 SIGQUIT递达。...sighandler函数返回后自动执行特殊的系统调用sigreturn再次进入内核态。 如果没有新的信号要递达,这次再返回用户态就是恢复main函数的上下文继续执行了。...信号,该信号的默认处理动作是忽略,父进程可以自定义SIGCHLD信号的处理函数,这样父进程只需专心处理自己的工作,不必关心子进程了,子进程终止时会通知父进程,父进程在信号处理函数中调用wait清理子进程即可

    5910

    Linux信号的保存和处理

    注意,阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作 信号在内存中的表示 信号在内核中的表示示意图: 每一个信号都有着三张表:block、pending、...每个信号都有两个标志位分别表示阻塞和未决(pending),还有一个函数指针表示处理动作。信号产生时,内核在进程控制块中设置该信号的未决标志,直到信号递达才清除该标志。...中断号就会变成寄存器中的数据,完后就可以用软件来操作。...再谈软件: 计算机中第一款软件是操作系统,操作系统需要在内存中先初始化一个函数指针数组,里面会有很多操作系统的方法,例如读磁盘、读网卡等,其中每一个设备有自己的中断号,中断号对应数组下标,这些都是操作系统提前完成的...CPU将寄存器里的值在函数指针数组中索引,CPU会执行读取键盘方法,读取到内存的指定区。 另外这个函数指针数组在硬件层面上叫做中断向量表。

    8510
    领券