首页
学习
活动
专区
圈层
工具
发布

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

Linux的实现:常规信号在递达之前产生多次只计一次,而实时信号在递达之前产生多次可以依次放在一个队列里 信号阻塞和未决的区别 信号阻塞(Blocking):是一个开关动作,指的是阻止信号被处理,但不是阻止信号产生...二、信号处理 1. sigtest_t 从上图来看,每个信号只有一个bit的未决标志,非0即1,不记录该信号产生了多少次,阻塞标志也是这样表示的。...阻塞信号集也叫做当前进程的 信号屏蔽字(Signal Mask),这里的“屏蔽”应该理解为阻塞而不是忽略 注意:该类型只在 Linux 系统上有效,是 Linux 给用户提供的一个用户级的数据类型...初始化 sigset_t 变量之后就可以在调用 sigaddset 和 sigdelset 在该信号集中添加或删除某种有效信号。 这四个函数都是成功返回0,出错返回-1。...sigismember是一个布尔函数,用于判断一个信号集的有效信号中是否包含某种信号,若包含则返回1,不包含则返回0,出错返回-1。

1.8K10

Linux信号

使用kill -l可以查看全部的信号 其中1-31为普通信号,34-64被称为实时信号 进程PCB中有一个位图结构用于标明该进程是否收到信号(32个比特位使用0/1来区分是否收到信号,0代表没收到...上述的图也可以简化成下面这样 六.信号集操作函数 1.sigset_t 每个信号只有一个bit的未决标志,非0即1,不记录该信号产生了多少次,阻塞标志也是这样表示的。...const sigset_t *set, sigset_t *oset); 返回值:若成功则为0,若出错则为-1 如果oset是非空指针,则读取进程的当前信号屏蔽字通过oset参数传出。...4.用以上函数写一个代码模块 该代码实现阻塞某一个信号,将这个信号的block位图由0置1,然后接触阻塞,使该信号递达,这个进程直接寄掉 #include #include信号的屏蔽,不屏蔽任何信号\n"; } } return 0; } 但是由于我对该信号做自定义捕捉了,所以2号信号无法终止该进程了。

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

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

    例如当前进程执行了除以0的指令,CPU的运算单元会产生异常,内核将这个异常解释为SIGFPE信号发送给进程。...Linux是这样实现的:常规信号在递达之前产生多次只计一次,而实时信号在递达之前产生多次可以依次放在一个队列里 3.3 sigset_t 从上图来看,每个信号只有一个bit的未决标志,非0即1,不记录该信号产生了多少次...0,若出错则为-1 如果oset是非空指针,则读取进程的当前信号屏蔽字通过oset参数传出。...调用成功则返回0,出错则返回-1。signo是指定信号的编号。若act指针非空,则根据act修改该信号的处理动作。若oact指针非空,则通过oact传出该信号原来的处理动作。...此方法对于Linux可用,但不保证在其它UNIX系统上都可用 测试代码 #include #include #include #include

    1.2K10

    Linux进程信号【信号产生】

    ---- 前言 在 Linux 中,进程具有独立性,进程在运行后可能 “放飞自我”,这是不利于管理的,于是需要一种约定俗成的方式来控制进程的运行,这就是 进程信号,本文将会从什么是进程信号开篇,讲述各种进程信号的产生方式及作用...,部分信号只做了解即可 1.2、信号的作用 早在 《Linux进程学习【进程状态】》 我们就已经使用过 信号 了,比如: kill -9 pid 终止进程运行 kill -19 pid 暂停进程运行 kill...可以通过 man 7 signal 进行查询 man 7 signal 简单总结一下,1~31 号信号对应的功能如下(表格内容引用自 2021dragon Linux中的31个普通信号) 信号编号 信号名...,立即终止进程 到目前为止,我们学习了很多信号,分别对应着不同的情况,其中有些信号还反映了异常信息,所以将信号进行细分,还是很有必要的 ---- 6、核心转储 Linux 中提供了一种系统级别的能力,当一个进程在出现异常的时候...),不再设置退出码,而是设置 core dump 位 及 终止信号 也就是说,父进程可以借此判断子进程是否产生了 核心转储 文件 ---- 总结 以上就是本次关于 Linux进程信号【信号产生】的全部内容了

    1.7K10

    Linux 信号

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

    6K20

    【Linux】————信号

    这些信号中,1-31为普通信号,34及以上为实时信号,这些信号都在什么条件下产生,默认的处理动作是什么,这些都在signal(7)中有着详细的说明man 7 signal 基本结论:信号就是Linux...sigset_t就是Linux给用户提供的一个用户级的数据类型,禁止用户直接修改位图。...int sigdelset(sigset_t *set, int signo); 把特定位置置0,如果是1就置0,如果是0就不动 int sigismember(const sigset_t *set...volatile 运行上面代码,按下ctrl+c后,信号被捕捉,gflag就被修改了,while循环条件为假,程序就结束了。 Linux系统中g++是有各种优化级别的。...此方法对于Linux可用,但不保证 在其它UNIX系统上都可用。 如果不关心子进程的退出信息,不想产生僵尸进程,就可以用这样做。

    1.1K10

    【Linux】信号

    今日更新了Linux信号的内容 欢迎大家关注点赞收藏⭐️留言 信号和信号量 二者之间没有任何关系。 信号 通过 kill -l 可以查看所有信号 其中,1-31号信号是普通信号。...这些信号各自在什么条件下产生,默认的处理动作是什么,在signal(7)中都有详细说明: man 7 signal 基本结论: 信号:Linux系统提供的一种,向指定进程发送特定事件的方式。...sigset_t就是Linux给用户提供的一个用户级的数据类型,禁止用户直接修改位图。...volatile 运行上面代码,按下ctrl+c后,信号被捕捉,gflag就被修改了,while循环条件为假,程序就结束了。 Linux系统中g++是有各种优化级别的。...此方法对于Linux可用,但不保证 在其它UNIX系统上都可用。 如果不关心子进程的退出信息,不想产生僵尸进程,就可以用这样做。

    1.7K10

    【Linux】:进程信号(信号概念 & 信号处理 & 信号产生)

    温馨提示:信号和信号量 二者之间没有任何关系 1, 信号概念 信号是 Linux 系统提供的一种向指定进程发送特定事件的方式,进程会对信号进行识别和处理。...,Stop为进程暂停…… (Core终止进程同时还会形成一个debug文件,Term仅终止进程) 基本特点: 信号:Linux系统提供的一种,向指定进程发送特定事件的方式。...exit(2); } exit(0); } 运行结果如下: 3.3.2 raise 函数 raise 函数可以给当前进程发送指定的信号(自己给自己发信号)。...Linux是提供了定时功能的,定时器也要被管理:先描述,在组织。...3.5 硬件异常产生信号 硬件异常被硬件以某种方式被硬件检测到并通知内核,然后内核向当前进程发送适当的信号 例如当前进程执行了除以0的指令,CPU的运算单元会产生异常,内核将这个异常解释为SIGFPE

    1.2K10

    Linux进程信号【信号处理】

    与真实的地址空间建立映射关系 每个进程都有自己的 进程地址空间,不同 进程地址空间 中地址可能冲突,但实际上地址是独立的 进程地址空间 可以让进程以统一的视角看待自己的代码和数据 关于 进程地址空间 的相关知识详见 《Linux...处理 过程 图片来源:Linux进程信号 ---- 3、信号的捕捉 接下来谈谈 信号 是如何被 捕捉 的 3.1、内核如何实现信号的捕捉?...); //实时信号相关,不用管 }; 返回值:成功返回 0,失败返回 -1 并将错误码设置 参数1:待操作的信号 参数2:sigaction 结构体,具体成员如上所示 参数3:保存修改前进程的 sigaction...0; } 当 2 号信号的循环结束(10 秒),3、4、5 信号的 阻塞 状态解除,立即被 递达,进程就被干掉了 注意: 屏蔽信号集 sa_mask 中已屏蔽的信号,在 用户自定义动作 执行完成后,...Linux进程信号【信号处理】的全部内容了,本文对信号的处理时机做了探讨,然后学习了 用户态 和 内核态 的相关内容,最后学习了 信号的捕捉 过程,至此 进程信号 部分内容已经全部完

    1.2K10

    Linux进程信号【信号保存】

    1 号信号就是位图中的 0 位置处,0 表示 未被阻塞/未产生未决,1 则表示 阻塞/未决 对于信号的状态修改,其实就是修改 位图 中对应位置的值(0/1) 对于多次产生的信号,只会记录一次信息(实时信号则会将冗余的信号通过队列组织..._val[3] |= (1 << 31) 置 0:XXX....未决信号集 #include int sigpending(sigset_t *set); 返回值:成功返回 0,失败返回 -1 并将错误码设置 参数:待获取的 未决信号集...如何根据 未决信号集 打印 pending 表 使用函数 sigismember 判断当前信号集中是否存在该信号,如果存在,输出 1,否则输出 0 如此重复,将 31 个信号全部判断打印输出即可...信号集 的操作都是在进程中进行的,不影响操作系统 ---- 总结 以上就是本次关于 Linux进程信号【信号保存】的全部内容了,在本文中,我们首先再一次对信号有了较深的理解,知道了在内核中存在三张表记录信号的处理流程

    1.2K20

    【Linux】进程信号——信号保存和信号捕捉

    我们从左到右说起: 第一张表是位图,比特位的位置是信号编号,比特位的含义是是否阻塞信号,1表示阻塞当前编号的信号,0表示为阻塞当前信号。...第二张表也是位图,比特位的位置是信号编号,比特位的含义是是否收到信号,1表示收到信号,0表示未收到信号。...CPU 通过 模式位(mode bit) 来区分这两种状态: 0 表示 内核态(特权模式)。 1 表示 用户态(受限模式)。...总结 通过本文的探讨,我们深入了解了Linux中进程信号的保存和捕捉机制。信号作为进程间通信的一种重要方式,能够有效地处理异步事件和异常情况。...希望本文的内容能够帮助你更好地理解Linux信号机制,并在实际开发中灵活运用。如果你有任何问题或建议,欢迎在评论区留言讨论!

    1.2K10

    【Linux信号】三:信号的捕捉

    signal() varies across Unix versions, and has also varied historically across different versions of Linux...注册一个信号捕捉函数,该函数由ANSI定义,由于历史原因在不同版本的Unix和不同版本的Linux中可能有不同的行为。因此应该尽量避免使用它,取而代之使用sigaction函数。...sa_flags 通常设置为0,表示使用默认属性。(sa_flags设置为0时,使用sa_handler动作) sa_restorer 该元素是过时的,不应该使用,POSIX.1标准将不指定该元素。...()); sleep(1); } return 0; } 2....实际上是这样的,未决信号集中使用某一位的0和1来记录信号是否被处理的,所以不管这个信号被发送了几次,未决信号集对应位也只能有一个1,后续也只能处理一次,它不会记录信号屏蔽期间总共发送了几次该信号,解除屏蔽后只会处理一次

    97410

    【Linux进程#4】:进程信号(信号概念 & 信号处理 & 信号产生)

    ✨ 眼里有诗,自向远方 个人主页:island1314 个人专栏:Linux—登神长阶 温馨提示:信号和信号量 二者之间没有任何关系...1, 信号概念 信号是 Linux 系统提供的一种向指定进程发送特定事件的方式,进程会对信号进行识别和处理。...,Stop为进程暂停…… (Core终止进程同时还会形成一个debug文件,Term仅终止进程) 基本特点: 信号:Linux系统提供的一种,向指定进程发送特定事件的方式。...exit(2); } exit(0); } 运行结果如下: 3.3.2 raise 函数 raise 函数可以给当前进程发送指定的信号(自己给自己发信号)。...Linux是提供了定时功能的,定时器也要被管理:先描述,在组织。

    50610

    【Linux】信号概念与信号产生

    此时我们运行程序,我们可以输入指令,bash 可以接收我们的指令,也就是说我们还能正常使用 bash 命令行,但是此时我们使用 ctrl + c 就杀不掉该进程了,这种进程我们称为后台进程,如下图: 在Linux...我们可以查看Linux中的信号列表,指令为: kill -l 其中我们发现,0号、32号和33号信号是没有的。...我们看一看一下信号表,其实进程是收到了 8 号信号: 我们也可以使用 man 7 signal 查看信号的详细信息,如下我们找到8号信号,看到它确实是除0错误: 我们还可以将该信号捕捉进行验证:...本质上是出现异常后,给对应的进程发信号了,而进程收到信号默认的处理动作就是终止自己,这就是进程崩溃的原因。那么为什么除0错误和野指针会给进程发信号呢?...core dump 是0;接下来我们使用 8 号信号杀掉子进程,因为 8 号信号是以 Core 方式终止进程的: 但是我们发现,core dump 也是0,这是为什么呢?

    81010

    Linux——进程信号

    那么为什么除0就会终止进程呢? 因为当前进程会收到OS的信号。...在Linux下有一个叫定时器的软件,可以设定一个闹钟,如果时间到了,会给当前进程发送编号为14的信号。(闹钟只会响一次) 参数是按照秒为单位设置一个信号。...在Linux中,有一个叫Int 80 —— 陷入内核。 这个是汇编指令,这个就是修改当前进程在寄存器中CR3的身份状态。...sigismember是一个布尔函数,用于判断一个信号集的有效信号中是否包含某种 信号,若包含则返回1,不包含则返回0,出错返回-1。...此方法对于Linux可用,但不保证在其它UNIX系统上都可用。 这里子进程退出也没留下任何痕迹。 还有一个细节: 明明对于17号信号处理就是”忽略“嘛?

    3.1K30

    【Linux】:进程信号(再谈信号保存和信号捕捉)

    ,都是对特定信号进行捕捉 调用成功则返回0,出错则返回-1 sigaction 本质就是修改信号的handler表 sigaction 跟前面的signal本质作用是一样的,都是对特定信号进行捕捉 sa_nandler...handler 之前, pending 位图由 0 变 1 sigaction 和 signal 的区别 sigaction 提供了更丰富的功能,比如更精细的控制信号屏蔽和信号处理标志。...SIGCHLD 信号 之前在这篇博客 【Linux】进程详解:进程的创建&终止&等待&替换_手动创建进程 里面 讲过用wait 和 waitpid 函数清理僵尸进程,父进程可以阻塞等待子进程结束,也可以非阻塞地查询是否有子进程结束等待清理...注意:此方法对于Linux可用,但是不保证在其它UNIX系统上都可用 请编写程序验证这样做不会产生僵尸进程 #include #include #include...int main() { // Linux 下,将 SIGCHLD 的处理动作置为 SIG_IGN ,这样fork 出来的子进程在终止时候会自动清理掉 ::signal(SIGCHLD

    91510

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

    这些信号都有一些共同点:一是简单;而是不能携带大量信息;三是满足某个特设条件才发送。 信号是信息的载体,是Linux/UNIX 环境下,古老而经典的通信方式, 现在依然是主要的通信手段。...3.4 PCB中的信号相关信息 Linux内核的进程控制块PCB是一个结构体task_struct,除了包含进程id、状态、工作目录、用户id、组id、文件描述符表、还包含了信号相关的信息,主要指阻塞信号集和未决信号集...3.5 信号的编号 可以使用 kill –l 命令查看当前系统有哪些可用信号 不存在编号为0的信号。...因此有些信号出现在Unix系统内,也出现在Linux中,而有的信号出现在FreeBSD或 Mac OS 中却没有出现在Linux下。这里我们只研究Linux系统中的信号。...如果pid > 0,发送信号给指定的进程。

    97910

    Linux信号列表

    我们运行如下命令,可看到Linux支持的信号列表: ~$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7...登录Linux时,系统会分配给登录用户一个终端(Session)。在这个终端运行的所有程序,包括前台进程组和后台进程组,一般都属于这个 Session。...当用户退出Linux登录时,前台进程组和后台有对终端输出的进程将会收到SIGHUP信号。这个信号的默认操作为终止进程,因此前台进 程组和后台有终端输出的进程就会中止。...不过可以捕获这个信号,比如wget能捕获SIGHUP信号,并忽略它,这样就算退出了Linux登录,wget也 能继续下载。 此外,对于与终端脱离关系的守护进程,这个信号用于通知它重新读取配置文件。...不仅包括浮点运算错误, 还包括溢出及除数为0等其它所有的算术的错误。 9) SIGKILL 用来立即结束程序的运行. 本信号不能被阻塞、处理和忽略。

    3.5K40

    【Linux】进程信号

    POSIX.1允许系统递送该信号⼀次或多次。Linux是这样实现的:常规信号在递达之前产⽣多次只计⼀次,⽽实时信号在递达之前产⽣多次可以依次放在⼀个队列⾥。本章不讨论实时信号。...3.3sigset_t 从上图来看,每个信号只有⼀个bit的未决标志, ⾮0即1, 不记录该信号产⽣了多少次,阻塞标志也是这样表⽰的。...sigismember是⼀个布尔函数,⽤于判断⼀个信号集的有效信号中是否包含 某种 信号,若包含则返回1,不包含则返回0,出错返回-1。...那是因为Linux的gnu C标准库,给我们把⼏乎所有的系统调⽤全部封装了。...,告知编译器,被该关键字修饰的变量,不允许被优化,对该 变量的任何操作,都必须在真实的内存中进⾏操作 结束语 信号我认为涉及到的知识量比较多,这一块算是Linux上的难点

    25010
    领券