近期接触了Linux平台的测试,遇到了软件发生异常,从而接触到了 Linux平台下的Signal——信号,用来通知进程发生了异步事件。...作为测试,免不了需要初步判断一下是否是正在的异常,因此学习了一下Signal NO 1 信号事件的发生有两个来源: 硬件来源(比如我们按下了键盘或者其它硬件故障); 软件来源,最常用发送信号的系统函数是...NO 2 Linux支持的信号列表如下(很多信号是与机器的体系结构相关的) 信号值 默认处理动作 发出信号的原因 SIGHUP 1 A 终端挂起或者控制进程终止...E 信号不能被捕获 F 信号不能被忽略 了解了以上信息后,再来看软件生成异常的log文件,其他的信息可以暂时不关注,将log信息中的Signal字段找出来,解读后面的数值 未了解之前: 跟开发了解了软件在出现异常时会写...,目前位置没有遇到过 以上简单分享了Linux下的Signal的含义,以及一些常用的信号值,后续还会继续有分享哟
2.4 硬件异常产生信号 硬件异常被硬件以某种方式被硬件检测到并通知内核,然后内核向当前进程发送适当的信号。...例如当前进程执行了除以0的指令,CPU的运算单元会产生异常,内核将这个异常解释为SIGFPE信号发送给进程。...再比如当前进程访问了非法内存地址,MMU会产生异常,内核将这个异常解释为SIGSEGV信号发送给进程 2.4.1 信号捕捉初识 #include #include <signal.h...Linux是这样实现的:常规信号在递达之前产生多次只计一次,而实时信号在递达之前产生多次可以依次放在一个队列里 3.3 sigset_t 从上图来看,每个信号只有一个bit的未决标志,非0即1,不记录该信号产生了多少次...此方法对于Linux可用,但不保证在其它UNIX系统上都可用 测试代码 #include #include #include #include
技术上 信号并不是由某个进程发起的,而是操作系统发给某个进程的,一个进程异常退出,必定收到了操作系统的信号。...);因为不是马上处理的,所以进程要对信号有保存能力 使用man 7 signal可以查看信号的默认处理行为 Term代表是正常退出; Core代表异常退出,可以开启核心转储功能提供错误定位(后文中会讲...此外还有一个abort()进程自己给自己发送六号信号 ---- 4.硬件异常产生信号 硬件异常产生信号通常是因为软件问题造成的,操作系统通过CPU中的状态寄存器的得知对应硬件的状态,即可向对应进程发送指定的信号...5.软件问题导致的异常 a.匿名管道的读端关闭,写端还尝试写,操作系统会向写端发送13号SIGPIPE终止写端 b.14号SIGALRM定时器信号 当设定的时间到达时,操作系统向进程发送14号信号终止进程...三.信号退出时的核心转储 前面提到如果一个信号是Trem则是正常退出,如果是Core则是异常退出,异常信息会写到核心转储中。
SIGCHLD产生的条件 实际上,在子进程结束的时候,会产生一个SIGCHLD信号,信号描述如下,根据man手册可以知道,子进程结束运行,其父进程会收到SIGCHLD信号,该信号的默认处理动作是忽略。...信号停止时; 子进程处在停止态,接受到SIGCONT后唤醒时; 既然子进程在退出或暂停的时候会发送SIGCHLD信号,那么我们就可以利用该信号,捕捉该信号,并在捕捉函数中完成子进程状态的回收,这样就不用使用...,但子进程没有继承未决信号集spending; 应该在fork之前,阻塞SIGCHLD信号,注册完捕捉函数后解除阻塞。...; 信号的处理方式必须是捕捉 (默认动作、忽略都不可以); 中断后返回-1, 设置errno为EINTR,表示被信号中断; 可以通过修改sa_flags参数来设置被信号中断后系统调用是否重启:SA_INTERRURT...sa_flags还有很多可选参数,适用于不同情况,比如:捕捉到信号后,在执行捕捉函数期间,不希望自动阻塞该信号,可将sa_flags设置为SA_NODEFER,除非sa_mask中包含该信号,等等。
---- 前言 信号从产生到执行,并不会被立即处理,这就意味着需要一种 “方式” 记录信号是否产生,对于 31 个普通信号来说,一个 int 整型就足以表示所有普通信号的产生信息了;信号还有可能被 “阻塞...的相关概念 1.1、概念 信号 传递过程:信号产生 -> 信号未决 -> 信号递达 信号产生(Produce):由四种不同的方式发出信号 信号未决(Pending):信号从 产生 到 执行 的中间状态...信号递达(Delivery):进程收到信号后,对信号的处理动作 在这三种过程之前,均有可能出现 信号阻塞 的情况 信号阻塞(Block):使信号传递 “停滞”,无论是否产生,都无法进行处理 信号递达后的三种处理方式...,本文探讨的是 信号保存阶段,即 物流信息 1.3、在内核中的表示 对于传递中的信号来说,需要存在三种状态表达: 信号是否阻塞 信号是否未决 信号递达时的执行动作 在内核中,每个进程都需要维护这三张与信号状态有关的表...---- 总结 以上就是本次关于 Linux进程信号【信号保存】的全部内容了,在本文中,我们首先再一次对信号有了较深的理解,知道了在内核中存在三张表记录信号的处理流程,然后我们学习了信号集的操作函数,
signal 信号是 UNIX 系统最先开始使用的进程间通信机制,因为 Linux 是继承于 UNIX 的,所以 Linux 也支持信号机制,通过向一个或多个进程发送 异步事件信号 来实现,信号可以从键盘或者访问不存在的位置等地方产生...你可以在 Linux 系统上输入 kill -l 来列出系统使用的信号,下面是我提供的一些信号 进程可以选择忽略发送过来的信号,但是有两个是不能忽略的:SIGSTOP 和 SIGKILL 信号。...例如:当进程收到 SIGFPE 浮点异常的信号后,默认操作是对其进行 dump(转储)和退出。信号没有优先级的说法。如果同时为某个进程产生了两个信号,则可以将它们呈现给进程或者以任意的顺序进行处理。...处于阻塞状态的进程只有再次唤醒后才会被 kill 掉 init 进程是 Linux 的初始化进程,这个进程会忽略任何信号。...SIGTRAP 在发生异常或者 trap 时,将 SIGTRAP 信号发送到进程 SIGURG 当套接字具有可读取的紧急或带外数据时,将 SIGURG 信号发送到进程。
---- 前言 在 Linux 中,进程具有独立性,进程在运行后可能 “放飞自我”,这是不利于管理的,于是需要一种约定俗成的方式来控制进程的运行,这就是 进程信号,本文将会从什么是进程信号开篇,讲述各种进程信号的产生方式及作用...,部分信号只做了解即可 1.2、信号的作用 早在 《Linux进程学习【进程状态】》 我们就已经使用过 信号 了,比如: kill -9 pid 终止进程运行 kill -19 pid 暂停进程运行 kill...可以通过 man 7 signal 进行查询 man 7 signal 简单总结一下,1~31 号信号对应的功能如下(表格内容引用自 2021dragon Linux中的31个普通信号) 信号编号 信号名...Linux 中提供了一种系统级别的能力,当一个进程在出现异常的时候,OS 可以将该进程在异常的时候,核心代码部分进行 核心转储,将内存中进程的相关数据,全部 dump 到磁盘中,一般会在当前进程的运行目录下...(被信号终止),不再设置退出码,而是设置 core dump 位 及 终止信号 也就是说,父进程可以借此判断子进程是否产生了 核心转储 文件 ---- 总结 以上就是本次关于 Linux进程信号【信号产生
,运行相应的进程 系统调用结束后 异常、中断、陷阱等处理完毕 信号的处理时机就是 内核态 切换为 用户态,也就是 当把更重要的事做完后,进程才会在操作系统的指导下,对信号进行检测、处理 下面来结合 进程地址空间...与真实的地址空间建立映射关系 每个进程都有自己的 进程地址空间,不同 进程地址空间 中地址可能冲突,但实际上地址是独立的 进程地址空间 可以让进程以统一的视角看待自己的代码和数据 关于 进程地址空间 的相关知识详见 《Linux...处理 过程 图片来源:Linux进程信号 ---- 3、信号的捕捉 接下来谈谈 信号 是如何被 捕捉 的 3.1、内核如何实现信号的捕捉?...截至目前,信号 处理的所有过程已经全部学习完毕了 信号产生阶段:有四种产生方式,包括 键盘键入、系统调用、软件条件、硬件异常 信号保存阶段:内核中存在三张表,blcok 表、pending 表以及 handler...表,信号在产生之后,存储在 pending 表中 信号处理阶段:信号在 内核态 切换回 用户态 时,才会被处理 ---- 总结 以上就是本次关于 Linux进程信号【信号处理】的全部内容了,本文对信号的处理时机做了探讨
信号捕捉主要是为了防止进程意外结束,并得到异常信息,捕捉信号后可以执行我们想要的动作。 1....signal() varies across Unix versions, and has also varied historically across different versions of Linux...注册一个信号捕捉函数,该函数由ANSI定义,由于历史原因在不同版本的Unix和不同版本的Linux中可能有不同的行为。因此应该尽量避免使用它,取而代之使用sigaction函数。...当注册了某个信号捕捉函数,在捕捉到该信号以后,就要调用该信号捕捉函数,而该函数有可能执行很长时间,在这期间所要屏蔽的信号不由M来指定,而是用sa_mask(临时屏蔽信号集)来指定,等到调用完信号处理函数...实际上是这样的,未决信号集中使用某一位的0和1来记录信号是否被处理的,所以不管这个信号被发送了几次,未决信号集对应位也只能有一个1,后续也只能处理一次,它不会记录信号屏蔽期间总共发送了几次该信号,解除屏蔽后只会处理一次
此时我们运行程序,我们可以输入指令,bash 可以接收我们的指令,也就是说我们还能正常使用 bash 命令行,但是此时我们使用 ctrl + c 就杀不掉该进程了,这种进程我们称为后台进程,如下图: 在Linux...我们可以查看Linux中的信号列表,指令为: kill -l 其中我们发现,0号、32号和33号信号是没有的。...所以进程一旦出异常了,不一定会退出,但是一旦异常退出了,一定是执行了信号所对应的异常处理方法。 (2)理解本质 下面我们进一步理解为什么除0错误和野指针会让进程崩溃。...那么根据我们的理解,一定是操作系统识别到了异常问题,然后给进程发信号,那么操作系统是怎么检测到异常问题的呢?...因为至始至终,进程引发了硬件异常问题,也没有修正问题,所以硬件异常一直存在,随着进程被调度,上下文错误也一直存在,所以操作系统一直检测到有这个异常,就一直给该进程发信号,而我们也一直在捕捉这个信号没有处理
在 Linux 中,进程信号被广泛应用于多种场景,例如进程间通信、异常处理、线程同步等。...本文将详细介绍 Linux 进程信号的基本概念、信号类型、信号处理方式、信号传递机制以及如何使用进程信号进行进程间通信、异常处理等。1. 概述进程信号是 Linux 中用于进程间通信和控制的一种机制。...进程信号在 Linux 中被广泛应用于多种场景,例如进程间通信、异常处理、线程同步等。下面将详细介绍 Linux 中进程信号的相关内容。2....异常处理进程信号是 Linux 中实现异常处理的一种方式。当一个进程发生异常或错误时,可以使用信号将异常信息传递给另一个进程或线程进行处理。...总结进程信号是 Linux 中用于进程间通信和控制的一种机制,也是实现异常处理和线程同步的重要手段。
Linux进程基础一文中已经提到,Linux以进程为单位来执行程序。我们可以将计算机看作一个大楼,内核(kernel)是大楼的管理员,进程是大楼的房客。...如果有信号,进程会执行对应该信号的操作(signal action, 也叫做信号处理signal disposition),此时叫做执行(deliver)信号。...从信号的生成到信号的传递的时间,信号处于等待(pending)状态(纸条还没有被查看)。...常见信号 信号所传递的每一个整数都被赋予了特殊的意义,并有一个信号名对应该整数。常见的信号有SIGINT, SIGQUIT, SIGCONT, SIGTSTP, SIGALRM等。这些都是信号的名字。...特别是获取信号的情况,程序往往会设置一些比较长而复杂的操作(通常将这些操作放到一个函数中)。 信号常常被用于系统管理,所以它的内容相当庞杂。深入了解信号,需要一定的Linux环境编程知识。
自己写的程序启动时偶尔会被SIGABRT信号杀死。故查看下SIGABRT的用法。 SIGABRT是中止一个程序,它可以被捕捉,但不能被阻塞。...当程序调用abort(3)时,该进程会向自己发送SIGABRT信号。所以,SIGABRT一般用于信号中一些关键的处理,assert失败时也会使用它。...你不应该去捕捉SIGSEGV和SIGABRT信号,如果收到这种信号,说明进程处于一个不确定的状态,很可能会直接挂起。 发现程序中确实有assert失败报错。...但是是哪个进程发送的SIGABRT信号暂时还不知道。
这些信号都有一些共同点:一是简单;而是不能携带大量信息;三是满足某个特设条件才发送。 信号是信息的载体,是Linux/UNIX 环境下,古老而经典的通信方式, 现在依然是主要的通信手段。...3.4 PCB中的信号相关信息 Linux内核的进程控制块PCB是一个结构体task_struct,除了包含进程id、状态、工作目录、用户id、组id、文件描述符表、还包含了信号相关的信息,主要指阻塞信号集和未决信号集...因此有些信号出现在Unix系统内,也出现在Linux中,而有的信号出现在FreeBSD或 Mac OS 中却没有出现在Linux下。这里我们只研究Linux系统中的信号。...硬件异常信号 当程序出现硬件异常会产生信号: 除0操作,浮点型错误,8号信号SIGFPE。 非法访问内存,11号信号SIGSEGV,段错误。 总线错误,7号信号SIGNUS。 3....给自己发送异常终止信号 6) SIGABRT 信号,终止并产生core文件。 函数参数 void 函数返回值 The abort() function never returns. 4.
,对于2号和3号信号处理动作默认为终止进程 2.系统调用 除了键盘向前台进程发送信号之外,前台进程会影响shell,linux规定跟shell交互的时候只允许有一个前台进程,默认情况下bash也是一个进程...信号的意义:信号的不同代表不同的事件,都是对事件发生之后的处理动作是可以一样的。 3.硬件异常产生信号 除零发送8号信号 信号产生,不一定非得用户显示的发送,有些情况下信号会在OS内部自动产生。...int main(int argc,char*argv[]) { //3.产生信号的方式:硬件异常产生信号 //信号产生,不一定非得用户显示的发送 while(true)...10乘以无穷大,结果无穷大,引起状态寄存器溢出标记位由0变成1,CPU发生了运算异常,OS得知CPU发生运算异常,就要识别异常:状态寄存器的标记位置为1,由当前进程导致的,在向目标进程发送信号,最后就终止进程了...核心转储是当进程出现异常的时候,我们将进程在对应的时刻,在内存中的有效数据转储到磁盘中。
外部信号:终端 Ctrl-C 产生 SGINT 信号,定时器到期产生SIGALRM等。 显式请求:kill函数允许进程发送任何信号给其他进程或进程组。 目前 Linux 支持64种信号。...信号分为非实时信号(不可靠信号)和实时信号(可靠信号)两种类型,对应于 Linux 的信号值为 1-31 和 34-64。 信号是异步的,一个进程不必通过任何操作来等待信号的到达。...信号实现原理 接下来我们分析一下Linux对信号处理机制的实现原理。...为了尽快让信号得到处理,Linux把信号处理过程放置在进程从内核态返回到用户态前,也就是在 ret_from_sys_call 处: // arch/i386/kernel/entry.S ENTRY...我们知道,从内核态返回到用户态时,CPU要从内核栈中找到返回到用户态的地址(就是调用系统调用的下一条代码指令地址),Linux为了先让信号处理程序执行,所以就需要把这个返回地址修改为信号处理程序的入口,
很多人经常把它们搞混,这篇文章会让你了解 Linux 的信号机制,以及一些常见信号的作用。 什么是信号 信号(Signal)是 Linux 进程收到的一个通知。...当进程收到一个信号时,该进程会中断其执行,并执行收到信号对应的处理程序。 信号机制作为 Linux 进程间通信的一种方法。Linux 进程间通信常用的方法还有管道、消息、共享内存等。...信号处理 一旦有信号产生,进程对它的处理都有下面三个选择。 执行缺省操作(Default)。Linux 为每个信号都定义了一个缺省的行为。...Linux 使用他们进行作业控制,让你能够手动干预和停止正在运行的应用程序,并在未来某个时间恢复程序的执行。...Not used starting with Oracle Solaris 10 reserved on Linux.
我们运行如下命令,可看到Linux支持的信号列表: ~$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7...UNIX支持的信号,是不可靠信号(非实时的),编号为32 ~ 63的信号是后来扩充的,称做可靠信号(实时信号)。...登录Linux时,系统会分配给登录用户一个终端(Session)。在这个终端运行的所有程序,包括前台进程组和后台进程组,一般都属于这个 Session。...当用户退出Linux登录时,前台进程组和后台有对终端输出的进程将会收到SIGHUP信号。这个信号的默认操作为终止进程,因此前台进 程组和后台有终端输出的进程就会中止。...不过可以捕获这个信号,比如wget能捕获SIGHUP信号,并忽略它,这样就算退出了Linux登录,wget也 能继续下载。 此外,对于与终端脱离关系的守护进程,这个信号用于通知它重新读取配置文件。
信号的意义:如果进程有异常,遇到异常终止了进程,那么是因为什么种类的异常停止了呢?这个时候就需要发送一个信号来判断是什么异常。 第三种方式,硬件异常产生的信号。 浮点数错误。...CPU运算发生了异常,OS就会知道,所以OS立刻就知道是当前进程出问题了,立刻向这个进程发送8号信号。 所以,收到信号不一定就会退出,如果没退出,有可能还会被调度。...在Linux下有一个叫定时器的软件,可以设定一个闹钟,如果时间到了,会给当前进程发送编号为14的信号。(闹钟只会响一次) 参数是按照秒为单位设置一个信号。...在Linux中,有一个叫Int 80 —— 陷入内核。 这个是汇编指令,这个就是修改当前进程在寄存器中CR3的身份状态。...此方法对于Linux可用,但不保证在其它UNIX系统上都可用。 这里子进程退出也没留下任何痕迹。 还有一个细节: 明明对于17号信号处理就是”忽略“嘛?
信号保存与信号捕捉 一、信号保存 1....信号的发送 那么在学习信号保存之前,我们先了解一下信号的发送,我们知道普通信号一共有31个,如下: 但是这个31就非常特殊,对于普通信号而言,对于进程而言,自己有还是没有收到哪一个信号。...所以这就是为什么只有操作系统才能有资格给进程发信号! 2. 理解信号保存 (1)信号保存原因 信号为什么要保存呢?...(2)信号保存概念 实际执行信号的处理动作称为信号递达(Delivery); 信号从产生到递达之间的状态,称为信号未决(Pending); 进程可以选择阻塞 (Block )某个信号; 被阻塞的信号产生时将保持在未决状态...一旦阻塞了某个信号,在该信号没有被解除阻塞之前,即便收到了该信号,对应的信号也不会被操作系统进行递达。
领取专属 10元无门槛券
手把手带您无忧上云