---- 前言 在 Linux 中,进程具有独立性,进程在运行后可能 “放飞自我”,这是不利于管理的,于是需要一种约定俗成的方式来控制进程的运行,这就是 进程信号,本文将会从什么是进程信号开篇,讲述各种进程信号的产生方式及作用...,部分信号只做了解即可 1.2、信号的作用 早在 《Linux进程学习【进程状态】》 我们就已经使用过 信号 了,比如: kill -9 pid 终止进程运行 kill -19 pid 暂停进程运行 kill...21 SIGTTIN 后台进程读终端控制台时,由终端驱动程序产生此信号并发送给该后台进程,该信号的默认处理动作是暂停进程 22 SIGTTOU 后台进程向终端控制台输出数据,由终端驱动程序产生此信号并发送给该后台进程...,如果有,就会把 状态寄存器(位图结构)中对应的比特位置 1,意味着出现了 异常 当操作系统检测到 状态寄存器 出现异常时,会根据其中的值,向出现异常的进程 轮询式 的发送信号,目的就是让进程退出 比如上面的...除 0 代码,发生异常后,CPU 将 状态寄存器 修改,变成 异常状态,操作系统检测到 异常 后会向进程发送 8 号信号,即使我们修改了 8 号信号的执行动作,但 因为状态寄存器仍然处于异常状态,所以操作系统才会不断发送
,向目标进程发信号,目标进程在合适的时候处理这个信号,对于2号和3号信号处理动作默认为终止进程 2.系统调用 除了键盘向前台进程发送信号之外,前台进程会影响shell,linux规定跟shell交互的时候只允许有一个前台进程...kill——向进程发送任意信号 kill:可以向任意进程发送任意信号 NAME kill - send signal to a process SYNOPSIS #include...所以OS有这个能力,那么对外提供能力只能通过系统调用的接口的方式来让用户向目标进程发送信号。...,在向目标进程发送信号,最后就终止进程了。...所以OS向进程发信号就是向目标进程的peding位图设置比特位,从0到1就是当前进程收到该信号,所以发信号应该是写信号,PCB属于OS内核结构,只有OS有权力修改pending位图,所以发送信号的载体只能是
man 7 signal 这个默认行为就是终止进程。 如果我想看到是如何向这个进程发送2号信号怎么办呢?...如果想退出可以用kill -9 pid或者ctrl+\(也是默认终止当前进程)。 信号发送接口 向任意进程发送信号 信号发送第一种方法是通过键盘发送,上面的组合键就是。...第二种方法是系统调用向目标进程发送信号。 这个接口就是向目标进程发送信号。 首先要清楚,OS才有权力向进程发送信号,对用户提供向进程发送信号的服务要通过系统调用才可以。...可以向任意进程发送任意信号。 向自己发送信号 参数就是信号编号。...在Linux下有一个叫定时器的软件,可以设定一个闹钟,如果时间到了,会给当前进程发送编号为14的信号。(闹钟只会响一次) 参数是按照秒为单位设置一个信号。
: SIG_DFL 默认处理动作,大多数信号最终都是终止进程 SIG_IGN 忽略动作,即进程收到信号后,不做任何处理动作 handler 用户自定义的信号执行动作 注意: 信号阻塞 是一种手段,可以发生在...,信号才被递达,进程被终止 如何证明信号已递达?...,当前进程的 pending 表中的 2 号信号位被置为 1,表示该信号属于 未决 状态,并且在五秒之后,阻塞结束,信号递达,进程终止 疑问:当阻塞解除后,信号递达,应该看见 pending 表中对应位置的值由...很简单,因为当前 2 号信号的执行动作为终止进程,进程都终止了,当然看不到 解决方法:给 2 号信号先注册一个自定义动作(别急着退出进程) 所以改进后的代码如下: #include ...---- 总结 以上就是本次关于 Linux进程信号【信号保存】的全部内容了,在本文中,我们首先再一次对信号有了较深的理解,知道了在内核中存在三张表记录信号的处理流程,然后我们学习了信号集的操作函数,
比如进程正在执行一个重要的 IO,突然一个终止信号发出,IO 立即终止,对进程、磁盘都不好 因此信号在 产生 后,需要等进程将 更重要 的事忙完后(合适的时机),才进行 处理 合适的时机:进程从...每个进程都有自己的 进程地址空间,不同 进程地址空间 中地址可能冲突,但实际上地址是独立的 进程地址空间 可以让进程以统一的视角看待自己的代码和数据 关于 进程地址空间 的相关知识详见 《Linux...操作系统的本质 - 操作系统也是软件啊,并且是一个死循环式等待指令的软件 - 存在一个硬件:操作系统时钟硬件,每隔一段时间向操作系统发送时钟中断 进程被调度,就意味着它的时间片到了,操作系统会通过时钟中断...,还需要坠入 内核态 通过一张图快速记录信号的 处理 过程 图片来源:Linux进程信号 ---- 3、信号的捕捉 接下来谈谈 信号 是如何被 捕捉 的 3.1、内核如何实现信号的捕捉?...表,信号在产生之后,存储在 pending 表中 信号处理阶段:信号在 内核态 切换回 用户态 时,才会被处理 ---- 总结 以上就是本次关于 Linux进程信号【信号处理】的全部内容了,本文对信号的处理时机做了探讨
,信号的出现使得进程直接的通信不在是被动的,不在向之前那样,read()操作往往需要等待write()操作结束。...(这个和Qt的信号槽差不多) 执行默认动作:Linux对每一个信号都规定了默认操作(可靠信号的默认操作是进程终止)。...没有向屏幕打印I am son.关于信号的详解,看这里:https://blog.csdn.net/zy010101/article/details/83932113 上面的kill函数发送的信号是不可靠信号...即:终止进程。如果我们需要自定义信号处理方式,那么就需要安装信号。Linux安装信号主要由signal()和sigaction()完成。signal是在可靠信号系统调用的基础上实现的,是库函数。...比如上面我们只是直接了当的发送两个信号。你也可以使当满足一定条件的时候才发送信号。比如下面这样。
,所以使用位图结构管理信号 而进程使用task_struct(PCB) 内部必定要存在一个位图结构,用int表示 从低到高的比特位,依次对应1-31 信号 发送信号的本质是写入信号,直接修改特定进程的信号位图中的特定比特位...渠道创建终端2,在保证运行终端1的可执行程序的情况下, 在终端2中输入 kill -9 +pid值 ,终止了终端1中运行的程序 ---- 实际上 在键盘中输入 CTRL C ,终止运行程序,本质也是向对前台进程发送信号...---- Linux通过远程终端访问时,只允许一个进程处于前台,默认情况是bash, 所以在自己的程序运行时输入指令没有任何反应 证明输入 CTRL C 就是向前台进程发送信号 输入 man 2...寄存器的内部写数字 就完成了硬件中断 ---- 操作系统内维护一张中断向量表 中断向量表内部包含函数指针 中断号作为中断向量表的下标,直接调用中断向量表中对应的方法 而这个方法会从键盘中读取数据 2.使用系统调用向进程发送信号...kill 输入 man 2 kill 指令 第一个参数为目标进程 第二个参数为信号 向目标进程(pid)发送对应的信号(sig) 成功返回0,失败返回-1 ---- 命令行参数 main函数的两个参数
Linux系统-进程信号 零、前言 一、信号入门 1、生活角度的信号 2、技术应用角度的信号 3、信号及其处理概念 二、信号产生 1、终端按键产生 2、kill命令发信号 3、软件条件产生信号 4、硬件异常产生信号...函数可以给一个指定的进程发送指定的信号;raise函数可以给当前进程发送指定的信号(自己给自己发信号) ;abort函数使当前进程接收到信号而异常终止 函数原型: #include <signal.h...4、硬件异常产生信号 硬件异常被硬件以某种方式被硬件检测到并通知内核,然后内核向当前进程发送适当的信号 示例:当前进程执行了除以0的指令,CPU的运算单元会产生异常,内核将这个异常解释 为...SIGFPE信号发送给进程;当前进程访问了非法内存地址,MMU会产生异常,内核将这个异常解释为SIGSEGV信号发送给进程 示例:子进程野指针错误 #include #include...系统发送信号的本质:修改进程PCB中的pending位图 如果在进程解除对某信号的阻塞之前这种信号产生过多次,将如何处理 POSIX.1允许系统递送该信号一次或多次,Linux是这样实现的
表示本次计算是否有溢出问题 假设本来有32/64位,除0时,导致有更高的进位,计算机识别有溢出了,若溢出,状态寄存器的溢出标记位就会置1 ---- 操作系统发现状态寄存器的标记位为1,即识别到硬件异常,从而会立马向目标进程发送信号...PCB,发送对应的信号,从而终止进程 ---- Segmentation fault对应11号信号 验证为11号信号 执行可执行程序后,会一直无线循环打印 由于MMU硬件报错没有被修复,一直存在...,所以每一次进程被调度,操作系统都会识别到异常,向进程发送11号信号 导致一直无线循环打印 ---- 核心转储 在众多信号中,存在Core和Term类型,都可以终止进程 两者之间有什么区别呢?...容我慢慢来说 ---- Linux在系统级别提供了一种能力,可以将一个进程异常的时候, 操作系统可以将该进程在异常的时候,核心代码部分进行核心转储 (将内存中进程的相关数据,全部dump到磁盘中) 一般会在当前进程的运行目录下...Term ,终止进程 ---- 在终端1中运行可执行程序,在终端2中发送2号信号干掉进程 ---- 当干掉进程后,并没有发现以pid结尾的文件 说明使用Term类型的信号,干掉进程后,不发生核心转储
同时也证明了,当我们按Ctrl+C时进程确实是收到了2号信号。 信号的发送与记录 我们使用kill -l命令可以查看Linux当中的信号列表。...通过系统函数向进程发信号 kill函数 实际上kill命令是通过调用kill函数实现的,kill函数可以给指定的进程发送指定的信号,kill函数的函数原型如下: kill函数用于向进程ID为pid...raise函数 raise函数用于给当前进程发送sig号信号,如果信号发送成功,则返回0,否则返回一个非零值。 例如,下列代码当中用raise函数每隔一秒向自己发送一个2号信号。...abort函数 abort函数可以给当前进程发送SIGABRT信号,也就是6号信号,使得当前进程异常终止。 例如,下列代码当中每隔一秒向当前进程发送一个SIGABRT信号。...下面我们来做一个简单的实验,实验步骤如下: 先用上述的函数将2号信号进行屏蔽(阻塞)。 使用kill命令或组合按键向进程发送2号信号。
1.信号处理相关问题 信号处理,不是可以立即处理的,而是在合适的时候 不懂点击: 信号的产生第三点 ---- 什么时候是合适的时候?...当进程从内核态切换回用户态的时候,进程会在操作系统的指导下,进行信号的检测与处理 ---- 内核态与用户态概念的理解 用户态:执行你写的代码的时候,用户所处的状态 内核态:执行操作系统的代码的时候,进程所处的状态...为了解决通过虚拟地址的方式随便去访问操作系统里面的代码和数据 提出用户态和内核态 ---- 若为用户态,想要去访问操作系统里面的代码和数据时,CPU就会拒绝执行代码,操作系统就可以识别非法访问,即硬件异常,向目标进程发送信号终止进程...用户无法直接更改 操作系统提供的所有的系统调用,内部在正式执行调用逻辑的时候,会去修改执行级别 信号处理的整体过程 进程返回时,需要进行信号检测 当执行完某种任务时,先找到对应的进程,检测对应的信号...若block为0(阻塞信号不执行),pending为1(收到信号),执行处理方法 若为忽略信号,则将pending由1改为0 ---- 若为自定义捕捉,当系统跳转过去执行的是自己写的方法 实际上自己写的方法是由用户态实现的
我们把这个过程研究明白就可以了 2 信号概念的基础储备 信号是Linux系统通过的一种向目标进程发送指定事件的方式。要做识别和处理。...那么kill信号能向进程发送信号!还有其他可以发送信号的方式吗?...我们来看: 3 信号产生 信号产生的方式有以下几种: 通过kill命令:向指定进程发送指定的信号 键盘可以产生信号:我们常用的ctrl + c (2号信号)和 ctrl + \(3号信号)都可以向进程发送信号...发送成功返回 1 反之返回 0。 还有 int raise(int sig); 系统调用是向当前进程发送指定信号。比较简单奥。 还有 void abort(void); 库函数异常终止当前进程。...即向目标进程发送信号! 那为什么不退出就会一直发信号? 因为寄存器只有一套,但是寄存器里面的数据是属于每一个进程的 — 对应硬件上下文的保存与恢复。
OS向进程发送信号就是在目标进程的pending位图中修改对应信号的比特位,从0修改为1,意思是当前进程收到该信号。...程序的崩溃本质是因为进程访问了未申请的空间,导致程序异常,OS向进程发送了终止进程的信号,但是实际上数组编译器在编译代码时,在栈上开辟的空间的大小与编译器是强相关的(并不仅由程序决定开辟多大空间,但是至少和程序申请的一样大...quit); 16 printf("我是正常退出的\n"); 17 return 0; 18 } 六、SIGCHLD信号 子进程退出时,会向父进程发送17号信号SIGCHLD...默认是收到信号就忽略处理,但是该等还是要等; 手动设置的SIG_IGN,子进程退出时发送给父进程的信号会被父进程忽略,但是子进程会被OS回收。 这两者是有区别的,含义不一样。...本文作者目前也是正在学习Linux相关的知识,如果文章中的内容有错误或者不严谨的部分,欢迎大家在评论区指出,也欢迎大家在评论区提问、交流。
Linux进程信号详【下】 核心转储 在进程等待这一章节,有一张图我没有详细解释: 当时在 进程等待 这一章节里我们并没有详细说明 Core dump标志,而我们通过man手册查看signal...而sigprocmask和sigpending接口分别对应第二和第一张表: 三个接口分别控制三张表,为了更好理解这些接口,准备应用以下场景: 1、屏蔽2号信号。2、给目标进程发送2号信号。...而Linux信号技术,本身就是 通过软件的方式来模拟硬件中断。 ...SIGCHLD信号 我们在学习进程的时候曾经说过,僵尸进程出现的原因是父进程没有回收子进程,实际上 子进程在终止时会发送 SIGCHLD 信号给父进程,而该 信号的默认处理动作是忽略,父进程可以对该信号进行自定义捕捉...我们说过,pending位图如果收到同一个信号多次,只会记录一次,那么如果有个场景是多个子进程在同时运行,最后子进程都结束了,发送了多次的SIGCHLD信号,但是pending位图只记录一次,所以这个时候我们只能处理一个子进程
2.系统调用 用键盘向前台进程发送信号,前台进程会影响shell,Linux规定跟shell交互时只允许有一个前台进程,实际上当我们运行自己的进程时,我们的进程就变成了前台进程,而sbash会被自动切到后台...当然,除了用键盘向前台进程发送信号外,我们可以用系统调用向进程发送信号。...kill——向任意进程发送信号 发送信号的能力是OS的,但是有这个能力并不一定有使用这个能力的权利,一般情况下要由用户决定向目标进程发送信号(通过系统提供的系统调用接口来向进程发送信号)。...OS是向写端进程发送13号信号,即当管道的读端关闭软件条件触发是,OS会向进程发送13号信号。 定时器——4号信号SIGALRM 定时器软件条件:alarm():设定闹钟。...OS向进程发送信号的本质是修改目标进程PCB中的信号位图。
作为一种进程间通信的基本形式,进程也可以给另一个进程发送信号。 --《linux系统编程》 ” 如上所述,信号可以实现进程间的通信。本章主要记录信号的使用方法。...在用户态下的进程发出的信号。如进程调用系统调用kill向其他进程发送信号。 与终端交互相关的信号。如用户关闭一个终端,或按下break键等情况。 跟踪进程执行的信号。...发送函数 kill(): 向其他进程发送信号 通常用法,kill给进程号为pid的进程发送信号sig。...-1 sig被发送到每个有权限发送信号的进程(除init进程外) <-1 sig被发送到进程组为-pid的每一个进程 sig 发送的信号量 返回值 0: 成功 -1:失败 raise(): 向自己所在进程发送信号...实例演示 功能: 设计两个C/S进程,其中一个client进程负责向server进程发送信号;server进程负责响应处理client信号。
信号是进程间通信机制中唯一的异步通信机制,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。进程之间可以互相通过系统调用kill发送软中断信号。...内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。信号机制除了基本通知功能外,还可以传递附加信息。 收到信号的进程对各种信号有不同的处理方法。...Linux在支持新版本的信号安装函数sigation()以及信号发送函数sigqueue()的同时,仍然支持早期的signal()信号安装函数,支持信号发送函数kill()。...这两个函数的最大区别在于,经过sigaction安装的信号都能传递信息给信号处理函数,而经过signal安装的信号不能向信号处理函数传递信息。对于信号发送函数来说也是一样的。...如按键盘的CTRL ^C时,会产生SIGINT信号,对该信号的默认反应就是进程终止。后32个信号表示实时信号,等同于前面阐述的可靠信号。这保证了发送的多个实时信号都被接收。
键盘产生信号,我们在上面也说了,使用 Ctrl-C 的方式可以终止进程,这就是一种键盘产生信号的方式,键盘产生信号的流程: 键盘特定输入 ——> OS解释为信号 ——> 向目标进程发送信号 ——> 进程收到信号...,指定时间(以秒为单位)后,向调用它的进程发送 SIGALRM 信号。...硬件异常被硬件以某种方式被硬件检测到并通知内核,然后内核向当前进程发送适当的信号。例如当前进程执行了除以0的指令,CPU的运算单元会产生异常,内核将这个异常解释 为SIGFPE信号发送给进程。...也就是说,操作系统向进程发送信号的本质是对进程PCB的位图进行写入操作!...但是当前进程被我们设置为一直在运行,异常在进程中仍然存在,这个时候OS又会向OF读取异常数据,进而再一次的对当前进程发送8号信号,这样不断的循环,就导致了上图的结果。
这一篇有区别于上一篇的“信号量”机制哈 平台的手机版对排版的支持有限,建议用电脑打开此文章 一,Linux信号的概念: 信号是 Linux 进程间通信的最古老的方式。...二,Linux信号的特点: 1.信号是异步的,进程不需要等待信号的到来,也不需要有获得信号的操作,而是在进程内部设置与信号对应的处理函数,有信号到达的时候,系统异步触发对应的处理函数。...9 pid, kill函数允许进程发送信号给其他进程或进程组 常见信号: 特殊说明: SIGPIPE, socket网络程序必须处理的信号,否则当客户端退出后,服务器端仍向客户端的socket发送数据...SIGCHLD, Linux中当子进程结束时,子进程并未被完全销毁,因为父进程还要用它的信息。...注意:接收信号进程和发送信号进程的所有者必须相同,或发送信号进程的所有者必须是超级用户。 e) 运行 kill /killall命令将发送信号。 此程序实际上是使用 kill 函数来发送信号。
操作系统有向进程发送信号的能力,但是他并没有这个权力,操作系统的能力是为用户提供的,用户才有发送信号的权力,操作系统通过给用户提供系统调用赋予用户让OS向进程发送信号的权力。...根据CPU的计算异常种类,向进程发送个8号信号对于操作系统还不简单吗?...如何理解OS向进程发送信号呢?发送信号的本质就是OS修改进程PCB结构体中的信号位图,将对应比特位由0置1即为进程接收到信号。 一个进程在未收到信号的时候,能否知道自己要对合法信号做什么处理呢?...,让进程对2和3信号进行阻塞,我们想看看在阻塞过程中,如果我们向进程发送信号,进程是否会递达呢?...,不会产生僵尸进程,也不会向父进程发送信号。
领取专属 10元无门槛券
手把手带您无忧上云