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

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

用户按下Ctrl-C ,这个键盘输入产生一个硬件中断,被OS获取,解释成信号,发送给目标前台进程 前台进程因为收到信号,进而引起进程退出 #include #include <unistd.h...: 忽略此信号 执行该信号的默认处理动作 提供一个信号处理函数,要求内核在处理该信号时切换到用户态执行这个处理函数,这种方式称为捕捉(Catch)一个信号 2.产生信号 2.1 通过终端按键产生信号...Linux是这样实现的:常规信号在递达之前产生多次只计一次,而实时信号在递达之前产生多次可以依次放在一个队列里 3.3 sigset_t 从上图来看,每个信号只有一个bit的未决标志,非0即1,不记录该信号产生了多少次...,使其中所有信号的对应bit清零,表示该信号集不包含任何有效信号 函数sigfillset初始化set所指向的信号集,使其中所有信号的对应bit置位,表示该信号集的有效信号包括系统支持的所有信号 注意,...此方法对于Linux可用,但不保证在其它UNIX系统上都可用 测试代码 #include #include #include #include

15810

Linux信号

一.信号基础 生活中 在生活中也有诸多信号,这些信号通常不是由我们发起的,而是我们接收以后对对应的信号做处理;最常见的莫过于红绿灯了,当红绿灯发出信号时(红灯,绿灯,黄灯);我们会有对应的行为,比如绿灯我们知道当前可以行走...使用kill -l可以查看全部的信号 其中1-31为普通信号,34-64被称为实时信号 进程PCB中有一个位图结构用于标明该进程是否收到信号(32个比特位使用0/1来区分是否收到信号,0代表没收到...如果传入main函数的参数个数不为3 { Usage(argv[0]); exit(1); } pid_t pid=atoi(argv[1]);//获取第一个命令行参数...,作为pid int signo=atoi(argv[2]);//获取第二个命令行参数,作为signo int n=kill(pid,signo);//需要发送信号的进程/发送几号信号...// 获取 sigpending(&pending); // 打印 show_pending(pending);

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

    Linux信号】四:SIGCHLD信号

    SIGCHLD产生的条件 实际上,在子进程结束的时候,会产生一个SIGCHLD信号信号描述如下,根据man手册可以知道,子进程结束运行,其父进程会收到SIGCHLD信号,该信号的默认处理动作是忽略。...信号停止时; 子进程处在停止态,接受到SIGCONT后唤醒时; 既然子进程在退出或暂停的时候会发送SIGCHLD信号,那么我们就可以利用该信号,捕捉该信号,并在捕捉函数中完成子进程状态的回收,这样就不用使用...,但子进程没有继承未决信号集spending; 应该在fork之前,阻塞SIGCHLD信号,注册完捕捉函数后解除阻塞。...; 信号的处理方式必须是捕捉 (默认动作、忽略都不可以); 中断后返回-1, 设置errno为EINTR,表示被信号中断; 可以通过修改sa_flags参数来设置被信号中断后系统调用是否重启:SA_INTERRURT...sa_flags还有很多可选参数,适用于不同情况,比如:捕捉到信号后,在执行捕捉函数期间,不希望自动阻塞该信号,可将sa_flags设置为SA_NODEFER,除非sa_mask中包含该信号,等等。

    13410

    Linux进程信号信号保存】

    假设已经获取到了信号的 pending 表 只需要进行位运算即可:pending |= (1 << (signo - 1)) 其中的 signo 表示信号编号,-1 是因为信号编号从 1 开始,需要进行偏移...,其中既可以表示 block 表信息,也可以表示 pending 表信息,可以通过信号集操作函数进行获取对应的信号集信息;信号集 的主要功能是表示每个信号的 “有效” 或 “无效” 状态 block...假设现在要获取第 127 个比特位 首先定位数组下标(对哪个数组操作):127 / (8 * sizeof (unsigned long int)) = 3 求余获取比特位(对哪个比特位操作):127...的操作 SIG_BLOCK 希望添加至当前进程 block 表 中阻塞信号,从 set 信号集中获取,相当于 mask |= set SIG_UNBLOCK 解除阻塞状态,也是从 set 信号集中获取...---- 总结 以上就是本次关于 Linux进程信号信号保存】的全部内容了,在本文中,我们首先再一次对信号有了较深的理解,知道了在内核中存在三张表记录信号的处理流程,然后我们学习了信号集的操作函数,

    20120

    Linux 信号

    signal 信号是 UNIX 系统最先开始使用的进程间通信机制,因为 Linux 是继承于 UNIX 的,所以 Linux 也支持信号机制,通过向一个或多个进程发送 异步事件信号 来实现,信号可以从键盘或者访问不存在的位置等地方产生...你可以在 Linux 系统上输入 kill -l 来列出系统使用的信号,下面是我提供的一些信号 进程可以选择忽略发送过来的信号,但是有两个是不能忽略的:SIGSTOP 和 SIGKILL 信号。...处于阻塞状态的进程只有再次唤醒后才会被 kill 掉 init 进程是 Linux 的初始化进程,这个进程会忽略任何信号。...当用户退出Linux登录时,前台进程组和后台有对终端输出的进程将会收到SIGHUP信号。这个信号的默认操作为终止进程,因此前台进 程组和后台有终端输出的进程就会中止。...不过可以捕获这个信号,比如wget能捕获SIGHUP信号,并忽略它,这样就算退出了Linux登录,wget也 能继续下载。 此外,对于与终端脱离关系的守护进程,这个信号用于通知它重新读取配置文件。

    4.8K20

    Linux进程信号信号产生】

    ---- 前言 在 Linux 中,进程具有独立性,进程在运行后可能 “放飞自我”,这是不利于管理的,于是需要一种约定俗成的方式来控制进程的运行,这就是 进程信号,本文将会从什么是进程信号开篇,讲述各种进程信号的产生方式及作用...,部分信号只做了解即可 1.2、信号的作用 早在 《Linux进程学习【进程状态】》 我们就已经使用过 信号 了,比如: kill -9 pid 终止进程运行 kill -19 pid 暂停进程运行 kill...可以通过 man 7 signal 进行查询 man 7 signal 简单总结一下,1~31 号信号对应的功能如下(表格内容引用自 2021dragon Linux中的31个普通信号信号编号 信号名...2.2、硬件中断 当我们从键盘按下 ctrl + c 时,发生了这些事:CPU 获取到键盘 “按下” 的信号,调用键盘相应的 “方法” ,从键盘中读取数据,读取数据后解析,然后发出 3 号信号 其中 CPU...),不再设置退出码,而是设置 core dump 位 及 终止信号 也就是说,父进程可以借此判断子进程是否产生了 核心转储 文件 ---- 总结 以上就是本次关于 Linux进程信号信号产生】的全部内容了

    30810

    Linux进程信号信号处理】

    ---- 前言 从信号产生到信号保存,中间经历了很多,当操作系统准备对信号进行处理时,还需要判断时机是否 “合适”,在绝大多数情况下,只有在 “合适” 的时机才能处理信号,即调用信号的执行动作。...与真实的地址空间建立映射关系 每个进程都有自己的 进程地址空间,不同 进程地址空间 中地址可能冲突,但实际上地址是独立的 进程地址空间 可以让进程以统一的视角看待自己的代码和数据 关于 进程地址空间 的相关知识详见 《Linux...处理 过程 图片来源:Linux进程信号 ---- 3、信号的捕捉 接下来谈谈 信号 是如何被 捕捉 的 3.1、内核如何实现信号的捕捉?..." << endl; // 最终不退出进程 int n = 10; while (n--) { // 获取进程的 未决信号集 sigset_t...表,信号在产生之后,存储在 pending 表中 信号处理阶段:信号在 内核态 切换回 用户态 时,才会被处理 ---- 总结 以上就是本次关于 Linux进程信号信号处理】的全部内容了,本文对信号的处理时机做了探讨

    24610

    Linux信号】三:信号的捕捉

    signal() varies across Unix versions, and has also varied historically across different versions of Linux...注册一个信号捕捉函数,该函数由ANSI定义,由于历史原因在不同版本的Unix和不同版本的Linux中可能有不同的行为。因此应该尽量避免使用它,取而代之使用sigaction函数。...信号捕捉的特性和处理 2.1 信号捕捉过程中有什么特性 在信号捕捉的时候,有如下几个特性 进程正常运行时,默认PCB中有一个信号屏蔽字假设为M,它决定了进程自动屏蔽哪些信号。...当注册了某个信号捕捉函数,在捕捉到该信号以后,就要调用该信号捕捉函数,而该函数有可能执行很长时间,在这期间所要屏蔽的信号不由M来指定,而是用sa_mask(临时屏蔽信号集)来指定,等到调用完信号处理函数...实际上是这样的,未决信号集中使用某一位的0和1来记录信号是否被处理的,所以不管这个信号被发送了几次,未决信号集对应位也只能有一个1,后续也只能处理一次,它不会记录信号屏蔽期间总共发送了几次该信号,解除屏蔽后只会处理一次

    14110

    Linux信号概念与信号产生

    此时我们运行程序,我们可以输入指令,bash 可以接收我们的指令,也就是说我们还能正常使用 bash 命令行,但是此时我们使用 ctrl + c 就杀不掉该进程了,这种进程我们称为后台进程,如下图: 在Linux...所以前台进程和后台进程的区别在于谁来获取键盘输入!...我们可以查看Linux中的信号列表,指令为: kill -l 其中我们发现,0号、32号和33号信号是没有的。...我们在以前学习进程控制的时候,进程在正常终止的时候,它会有自己的退出状态,也就是wait时,获取的 status 参数,这个 status 一共是32个比特位,我们只使用低十六位,其中我们通过次低八位,...下面我们获取一下验证一下: int main() { pid_t id = fork(); // child if(id == 0)

    19010

    Linux信号】一:信号的概念、信号的产生

    一、什么是信号 1. 信号的概念 信号在生活中随处可见,比如体育比赛中使用的信号枪、我给你传递一个眼神(你懂的哈哈哈),等等。...这些信号都有一些共同点:一是简单;而是不能携带大量信息;三是满足某个特设条件才发送。 信号是信息的载体,是Linux/UNIX 环境下,古老而经典的通信方式, 现在依然是主要的通信手段。...3.4 PCB中的信号相关信息 Linux内核的进程控制块PCB是一个结构体task_struct,除了包含进程id、状态、工作目录、用户id、组id、文件描述符表、还包含了信号相关的信息,主要指阻塞信号集和未决信号集...文件,主要是查验进程终止原因, 用于gdb调试 Stop:停止(暂停)进程 Cont:继续运行进程 3.7 信号帮助文档 可通过 man 7 signal 查看帮助文档获取标准信号信息表 在标准信号中,...因此有些信号出现在Unix系统内,也出现在Linux中,而有的信号出现在FreeBSD或 Mac OS 中却没有出现在Linux下。这里我们只研究Linux系统中的信号

    9210

    Linux信号基础

    Linux进程基础一文中已经提到,Linux以进程为单位来执行程序。我们可以将计算机看作一个大楼,内核(kernel)是大楼的管理员,进程是大楼的房客。...从信号的生成到信号的传递的时间,信号处于等待(pending)状态(纸条还没有被查看)。...常见信号 信号所传递的每一个整数都被赋予了特殊的意义,并有一个信号名对应该整数。常见的信号有SIGINT, SIGQUIT, SIGCONT, SIGTSTP, SIGALRM等。这些都是信号的名字。...也叫做获取 (catch) 信号。执行进程中预设的对应于该信号的操作。 进程会采取哪种操作,要根据该进程的程序设计。...特别是获取信号的情况,程序往往会设置一些比较长而复杂的操作(通常将这些操作放到一个函数中)。 信号常常被用于系统管理,所以它的内容相当庞杂。深入了解信号,需要一定的Linux环境编程知识。

    2.5K50

    Linux信号处理

    外部信号:终端 Ctrl-C 产生 SGINT 信号,定时器到期产生SIGALRM等。 显式请求:kill函数允许进程发送任何信号给其他进程或进程组。 目前 Linux 支持64种信号。...信号分为非实时信号(不可靠信号)和实时信号(可靠信号)两种类型,对应于 Linux信号值为 1-31 和 34-64。 信号是异步的,一个进程不必通过任何操作来等待信号的到达。...信号实现原理 接下来我们分析一下Linux信号处理机制的实现原理。...signr) break; 上面这段代码的主要逻辑是通过 dequeue_signal() 函数获取到进程接收队列中的一个信号,如果没有信号,那么就跳出循环。...代码 k = ¤t->sig->action[sig-1] 就是获取对应信号的处理程序,然后把其设置为新的信号处理程序即可。

    5.9K40

    Linux】进程信号

    ,对于2号和3号信号处理动作默认为终止进程 2.系统调用 除了键盘向前台进程发送信号之外,前台进程会影响shell,linux规定跟shell交互的时候只允许有一个前台进程,默认情况下bash也是一个进程...证明:通过signal接口,把SIGFPE信号自定义捕捉: void catchSig(int signo) { cout<<"获取到一个信号信号编号是:"<<signo<<endl; }...(int signo) { cout<<"获取到一个信号信号编号是:"<<signo<<endl; exit(1); } int main(int argc,char*argv[])...如果没有打印: int cnt = 0; void catchSig(int signo) { cout<<"获取到一个信号信号编号是:"<<cnt<<endl; } int main(int...sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); //act:结构体对象;oldact:输出型参数,获取特定信号老的处理方法

    18310

    Linux 信号(Signal)

    很多人经常把它们搞混,这篇文章会让你了解 Linux信号机制,以及一些常见信号的作用。 什么是信号 信号(Signal)是 Linux 进程收到的一个通知。...当进程收到一个信号时,该进程会中断其执行,并执行收到信号对应的处理程序。 信号机制作为 Linux 进程间通信的一种方法。Linux 进程间通信常用的方法还有管道、消息、共享内存等。...信号处理 一旦有信号产生,进程对它的处理都有下面三个选择。 执行缺省操作(Default)。Linux 为每个信号都定义了一个缺省的行为。...Linux 使用他们进行作业控制,让你能够手动干预和停止正在运行的应用程序,并在未来某个时间恢复程序的执行。...Not used starting with Oracle Solaris 10 reserved on Linux.

    1.1K10

    Linux——进程信号

    Linux下有一个叫定时器的软件,可以设定一个闹钟,如果时间到了,会给当前进程发送编号为14的信号。(闹钟只会响一次) 参数是按照秒为单位设置一个信号。...在Linux中,有一个叫Int 80 —— 陷入内核。 这个是汇编指令,这个就是修改当前进程在寄存器中CR3的身份状态。...int count = 5; while(true) { sigpending(&pengding);//获取他 show_pending(pengding...第三个成员是信号集。 也就是说第二个参数是要对于该信号做一些列结构体中内容的设置的,是一个输入性参数。 第三个参数是一个输出型参数,获取对应信号老的处理方法。 成功返回0,失败返回-1。...此方法对于Linux可用,但不保证在其它UNIX系统上都可用。 这里子进程退出也没留下任何痕迹。 还有一个细节: 明明对于17号信号处理就是”忽略“嘛?

    2.7K30

    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也 能继续下载。 此外,对于与终端脱离关系的守护进程,这个信号用于通知它重新读取配置文件。

    3K40

    Linux信号保存与信号捕捉处理

    信号保存与信号捕捉 一、信号保存 1....所以对于某个信号,对应上面的三张表中,我们应该横向看,是否被屏蔽、是否收到、对应方法。所以我们对于信号的学习,无论给我们提供多少系统接口,都是围绕这三张表获取或者修改。 3....我们要获取的 pending 表和 block 表都是位图,这就注定了要在用户空间到内核空间,内核空间到用户空间进行来回拷贝,所以数据拷贝时就要在系统调用接口的参数上设置输入输出型参数。...所以操作系统给我们提供了一种经过封装的数据类型,来获取内核中的位图,就是 sigset_t. (1)sigset_t sigset_t 其实就是一个位图结构,我们称为信号集。...*set, sigset_t *oldset); 其中第一个参数代表我们需要设置还是获取 block 表,有三个选项,如下,它们之间是并列关系,只能三选一: SIG_BLOCK:set 包含了我们希望添加到当前信号屏蔽字

    17311

    初谈Linux信号-=-信号的产生

    忽略快 递(快递拿上来之后,扔掉床头,继续开一把游戏) 快递到来的整个过程,对你来讲是异步的,你不能准确断定快递员什么时候给你打电话 Linux信号Linux操作系统中通过kill -l命令可查看所有的信号...: 信号是从1号开始的的,从信号1到信号31是普通信号,从信号35到信号64称之为实时信号,一般不考虑实时信号。...信号Linux系统提供的一种向指定进程发送特定事件的一种方式,系统在收到信号时会做识别和处理。...信号产生是异步的:信号的产生和目标进程的运行是两条线,信号可以在程序的任意时刻产生,并且会打断当前正在执行的代码,转而执行信号处理函数。...如果把所有信号都捕捉了,会出现什么现象: 无论哪一个信号都无法终止程序,为了避免这种情况,系统中9号信号不允洗自定义捕捉 真正发送信号的是操作系统,只有操作系统可以发送信号

    8010

    Linux信号】二:未决信号集、阻塞信号集、信号集操作函数

    阻塞信号集与未决信号Linux内核的进程控制块PCB是一个结构体task_struct,除了包含进程id、状态、工作目录、用户id、组id、文件描述符表、还包含了信号相关的信息,主要指阻塞信号集和未决信号集...阻塞信号集:也叫信号屏蔽字,将某些信号加入集合,对他们设置屏蔽,当屏蔽某个信号后,再收到该信号,该信号的处理将推后(解除屏蔽后)。...未决信号集: 信号产生,未决信号集中描述该信号的位立刻翻转为1,表信号处于未决状态;当信号被处理对应位翻转回为0,这一时刻往往非常短暂。...获取当前进程的未决信号集。 函数参数 set:传出参数,传出当前未决信号集。...*/ sigpending(&mvector); /*获取当前未决信号集*/ int signo = 1; for(signo = 1; signo <

    13610
    领券