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

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

信号捕捉主要是为了防止进程意外结束,并得到异常信息,捕捉信号后可以执行我们想要的动作。 1....注册一个信号捕捉函数,该函数由ANSI定义,由于历史原因在不同版本的Unix和不同版本的Linux中可能有不同的行为。因此应该尽量避免使用它,取而代之使用sigaction函数。...注册捕捉函数,所谓的捕捉信号就是指,信号发生时执行什么动作。 函数参数 signum:要捕捉的信号编号。 act:传入参数(const修饰,不可修改),新的处理方式。...信号捕捉的特性和处理 2.1 信号捕捉过程中有什么特性 在信号捕捉的时候,有如下几个特性 进程正常运行时,默认PCB中有一个信号屏蔽字假设为M,它决定了进程自动屏蔽哪些信号。...当注册了某个信号捕捉函数,在捕捉到该信号以后,就要调用该信号捕捉函数,而该函数有可能执行很长时间,在这期间所要屏蔽的信号不由M来指定,而是用sa_mask(临时屏蔽信号集)来指定,等到调用完信号处理函数

47010

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

信号捕捉 用户态与内核态 在操作系统中,CPU 主要运行在 用户态(User Mode) 或 内核态(Kernel Mode)。这两种模式是 操作系统的特权级别,用于保护系统的安全和稳定性。...信号捕捉流程 之前讲到处理信号是在合适的时候处理的,什么是合适的时候呢?...总结 通过本文的探讨,我们深入了解了Linux中进程信号的保存和捕捉机制。信号作为进程间通信的一种重要方式,能够有效地处理异步事件和异常情况。...我们学习了信号的基本概念、信号的保存方式(如信号掩码和未决信号集),以及如何通过信号处理函数来捕捉和处理信号。 在实际应用中,合理地使用信号机制可以大大提高程序的健壮性和响应能力。...希望本文的内容能够帮助你更好地理解Linux信号机制,并在实际开发中灵活运用。如果你有任何问题或建议,欢迎在评论区留言讨论!

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

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

    信号保存与信号捕捉 一、信号保存 1....那么当我们捕捉对应信号后自定义的方法,就将我们的方法的地址填入对应的位置即可!...二、信号捕捉处理 1. 信号的处理 我们在上面说过,信号保存是为了让进程在合适的时候处理,那么信号是什么时候被处理的呢?...信号的捕捉 我们理解了内核态和用户态之后,我们下面结合下图来理解信号的捕捉: 所以信号保存是为了让进程在合适的时候处理,那么信号是在内核态返回用户态时进行处理的! 4....我们可以在执行捕捉方法时,打印 pending 表,观察 pending 表在执行捕捉方法时对应的位置是否已经置0,如果已经置0,说明是在执行捕捉方法前由1置0,否则相反,下面我们验证一下: void

    28511

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

    ,都是对特定信号进行捕捉 调用成功则返回0,出错则返回-1 sigaction 本质就是修改信号的handler表 sigaction 跟前面的signal本质作用是一样的,都是对特定信号进行捕捉 sa_nandler...将 sa_nandler 赋值为常数 SIG_IGN 传给 sigaction 表示忽略信号 赋值为常数 SIG_DFL 表示执行系统默认动作 赋值为一个函教指针表示用自定义函数捕捉信号,或者说向内核注册了一个信号处理函数...SIGCHLD 信号 之前在这篇博客 【Linux】进程详解:进程的创建&终止&等待&替换_手动创建进程 里面 讲过用wait 和 waitpid 函数清理僵尸进程,父进程可以阻塞等待子进程结束,也可以非阻塞地查询是否有子进程结束等待清理...注意:此方法对于Linux可用,但是不保证在其它UNIX系统上都可用 请编写程序验证这样做不会产生僵尸进程 #include #include #include...int main() { // Linux 下,将 SIGCHLD 的处理动作置为 SIG_IGN ,这样fork 出来的子进程在终止时候会自动清理掉 ::signal(SIGCHLD

    46010

    【Linux】:进程信号(详谈信号捕捉 & OS 运行)

    信号捕捉的流程 前情回顾 + 知识补充: ​​​​​​​​​​​​ 还记得我们之前说过的吗,处理信号时并不一定立即去处理,有可能此时我们在做一个优先级很高的事情, 此时信号处理就会等到一个合适的时候去处理...内核态:我自己写的代码 内核态:执行操作系统的代码 两者都属于操作系统运行状态 言归正传,让我们开始讲信号捕捉的具体流程 如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号...那是因为 Linux 的 gnu C 标准库,给我们把几乎所有的系统调用全部封装了。...程序通过 int 0x80 中断来触发系统调用,系统调用号通过 eax 寄存器传递 ② 在现代的 64 位架构中(如 x86_64),通常使用 syscall 指令,并通过寄存器传递系统调用号和参数 在 Linux...例如,在 Linux 操作系统中,通过启用某些功能(如页表共享)来加速内核与用户空间之间的切换。 共享内存:用户空间和内核空间共享一部分页表时,可以通过共享内存区域实现。

    22010

    【linux学习指南】linux捕捉信号

    前言 信号捕捉的流程 如果信号的处理动作是⽤⼾⾃定义函数,在信号递达时就调⽤这个函数,这称为捕捉信号。...⽤⾃定义函数捕捉信号,或者说向内核注册了⼀个信号处理函数,该函数返回值为void,可以带⼀个int参数,通过参数可以得知当前信号的编号,这样就可以⽤同⼀个函数处理多种信号。...当某个信号的处理函数被调⽤时,内核⾃动将当前信号加⼊进程的信号屏蔽字,当信号处理函数返回时⾃动恢复原来的信号屏蔽字,这样就保证了在处理某个信号时,如果这种信号再次产⽣,那么它会被阻塞到当前处理结束为⽌。...如果在调⽤信号处理函数时,除了当前信号被⾃动屏蔽之外,还希望⾃动屏蔽另外⼀些信号,则⽤sa_mask字段说明这些需要额外屏蔽的信号,当信号处理函数返回时⾃动恢复原来的信号屏蔽字。...操作系统是怎么运⾏的 硬件中断 中断向量表就是操作系统的⼀部分,启动就加载到内存中了 通过外部硬件中断,操作系统就不需要对外设进⾏任何周期性的检测或者轮询 由外部设备触发的,中断系统运⾏流程,叫做硬件中断 // Linux

    14710

    【Linux】进程信号的捕捉处理

    一、信号捕捉处理的概述 1、信号捕捉处理全过程 如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号,这个我们前面说过,但是我们的过程是比较复杂的,首先我们在执行主控制流程的某条指令时因为系统调用等原因会进入内核...,然后内核处理完成后发送信号,如果信号的处理动作是自定义的信号处理函数就回到用户区执行信号处理函数,执行完之后因为信号处理函数的特殊性,它要再次进入内核区,然后回到用户模式继续执行 我们在用户区和内核区来回切换的时候...,操作系统负责做我们的身份(用户身份和内核身份)切换工作,用户态陷入内核态是通过汇编指令int 80完成的 在进程从内核态返回用户态时进行信号的检测和处理 并且main函数和自定义信号捕捉处理函数使用不同的堆栈空间...,1号信号会将进程终止,当我们发送2号信号,sigaction函数将信号捕捉后,我们进入到handler函数,开始打印全0的pending位图,此时属于信号处理函数处理信号的过程,然后我们发送1234号信号...,这个信号刚好被捕捉了,执行自定义动作,刚好自定义动作是将node2头插 void handler(int signo) { insert(&node2); } insert(struct Node*

    12510

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

    ✨ 不懂就问,问了不懂,你懂问他 个人主页:island1314 个人专栏:Linux—登神长阶...,都是对特定信号进行捕捉 调用成功则返回0,出错则返回-1 sigaction 本质就是修改信号的handler表 sigaction 跟前面的signal本质作用是一样的,都是对特定信号进行捕捉 sa_nandler...将 sa_nandler 赋值为常数 SIG_IGN 传给 sigaction 表示忽略信号 赋值为常数 SIG_DFL 表示执行系统默认动作 赋值为一个函教指针表示用自定义函数捕捉信号,或者说向内核注册了一个信号处理函数...SIGCHLD 信号 之前在这篇博客 【Linux】进程详解:进程的创建&终止&等待&替换_手动创建进程 里面 讲过用wait 和 waitpid 函数清理僵尸进程,父进程可以阻塞等待子进程结束,也可以非阻塞地查询是否有子进程结束等待清理...注意:此方法对于Linux可用,但是不保证在其它UNIX系统上都可用 请编写程序验证这样做不会产生僵尸进程 #include #include #include

    8110

    【Linux】进程信号 --- 信号的产生 保存 捕捉递达

    假设我们把所有的信号都捕捉了,并且捕捉后的处理行为也不终止这个进程,那么是不是这个进程就金刚不坏,哪个信号都没有办法杀死他呢?...另外补充一个知识点,linux规定,当用户在和shell交互时,默认只能有一个前台进程,所以当我们自己编写的程序运行时,bash进程就会自动由前台进程转换为后台进程。...在linux系统中,当用户进程调用系统调用时,会提前执行一个int 0x80汇编指令(也称为中断指令),此指令会触发一个软中断(也称为陷阱),这个指令会让处理器从用户态切换为内核态,便于内核能够访问进程的上下文数据...递达像是一个过程,而捕捉更像是一个动作,当信号的处理行为是自定义行为,那么在信号递达的时候会调用对应的handler方法,此时我们称调用handler方法为捕捉信号。...注意:此方法对于Linux系统可用,但不保证在其他UNIX系统上也可用,比如MAC OS 或 直接本身就是UNIX操作系统。

    1.8K10

    信号捕捉(拦截)

    在一个程序收到某些信号后,程序都会自动去执行默认的操作,但大多的操作都会导致程序异常退出,除了前文我们介绍的阻塞信号以外,我们还可以对信号进行捕获(拦截)处理,让被捕获的信号去执行我们已经编写好的函数中...当函数执行成功,会将第一个参数中的信号捕获并让其指向我们自己编写的处理函数。...具体代码如下: #include #include #include // 自定义的信号处理函数 void mySigAction(int...(1); } return 0; } 以上代码执行的效果如下: 这是 C 语言库函数提供给我们的方法,除了这个方法外,我们还可以使用 linux/unix 系统提供给我们的系统函数来实现如上功能...(sigaction第三个参数),如果需要恢复的时候,可以使用这个保存下来的结构体恢复到原来的信号处理过程。

    34720

    【进程信号】四、信号的捕捉

    信号的捕捉 ​ 在讲信号集的操作之前,我们先来讲讲信号的捕捉原理和内核态、用户态的知识,帮助我们后面的理解!...2、信号的捕捉 ​ 了解了上面的知识,我们现在尝试着来理解一下信号的捕捉过程,我们先讲过程,然后给出一个大概的过程图帮助理解! ​...其实这会 OS 会顺便去检测一下我们学过的 pending 位图、block 位图和 handler 函数数组,如果对应的一些信号产生了,并且没有被阻塞,那么就会将这些信号进行捕捉(也就是处理)! ​...而我们知道,捕捉的方法有三种:默认、忽略、自定义。...⚜️注意:上述这种情况是针对自定义捕捉来说的,对于默认和忽略动作,并不会这么复杂! ​ 下面再贴一个参考图: ​ 如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号。

    13300

    linux系统编程之信号(四):信号的捕捉与sigaction函数

    一、内核如何实现信号的捕捉 如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号。由于信号处理函数的代码是在用户空间的,处理过程比较复杂,举例如下: 1....,赋值为常数SIG_DFL表示执行系统默认动作,赋值为一个函数指针表示用自定义函数捕捉信号,或者说向内核注册了一个信号处理函数,该函数返回值为void,可以带一个int参数,通过参数可以得知当前信号的编号...simba@ubuntu:~/Documents/code/linux_programming/APUE/signal$ ....()实现的; 《Linux 多线程应用中如何编写安全的信号处理函数》 http://www.ibm.com/developerworks/cn/linux/l-cn-signalsec/ 参考:《APUE...》、《linux c 编程一站式学习》

    4K00

    【在Linux世界中追寻伟大的One Piece】信号捕捉|阻塞信号

    catch a sig : %d\n", sig); } int main() { signal(2, handler); //信号是可以被自定义捕捉的,siganl函数就是来进行信号捕捉的...POSIX.1允许系统递送该信号一次或多次。Linux是这样实现的:常规信号在递达之前产生多次只计一次,而实时信号在递达之前产生多次可以依次放在一个队列里。...3 -> 捕捉信号 3.1 -> 内核如何实现信号的捕捉 如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号。...将sa_handler赋值为常数SIG_IGN传给sigaction表示忽略信号,赋值为常数SIG_DFL表示执行系统默认动作,赋值为一个函数指针表示用自定义函数捕捉信号,或者说向内核注册了一个信号处理函数...此方法对于Linux可用,但不保证在其它UNIX系统上都可用。请编写程序验证这样做不会产生僵尸进程。

    19110

    Shell 信号发送与捕捉

    1、Linux信号类型 信号(Signal):信号是在软件层次上对中断机制的一种模拟,通过给一个进程发送信号,执行相应的处理函数。...进程可以通过三种方式来响应一个信号: 1)忽略信号,即对信号不做任何处理,其中有两个信号不能忽略:SIGKILL及SIGSTOP。 2)捕捉信号。...3)执行缺省操作,Linux对每种信号都规定了默认操作。 Linux究竟采用上述三种方式的哪一个来响应信号呢?取决于传递给响应的API函数。...Linux支持两种信号: 一种是标准信号,编号1-31,称为非可靠信号(非实时),不支持队列,信号可能会丢失,比如发送多次相同的信号,进程只能收到一次,如果第一个信号没有处理完,第二个信号将会丢弃。...-l #打印编号1-64编号信号名称 arg # 捕获信号后执行的命令或者函数 signal_spec # 信号名或编号 一般捕捉信号后,做以下几个动作: 1)清除临时文件

    2.5K30

    捕捉和处理SIGINT信号的方法

    在编写C++程序时,可能会遇到需要捕捉和处理信号的情况。其中,SIGINT信号是用户向程序发送的中断信号,使用Ctrl+C即可发送该信号。...本文将从以下几个方面对如何捕捉和处理SIGINT信号进行详细阐述。 一、信号处理函数 处理信号需要定义一个信号处理函数,并在程序中注册该函数。...二、注册信号处理函数 将信号处理函数注册到SIGINT信号上,可以对该信号进行捕捉和处理。在C++中,可以使用signal()函数进行注册。...在信号处理函数中,将该标志位设置为true,表示接收到了SIGINT信号。 四、防止重复信号 在信号处理函数中,可能会产生一些耗时的操作,如释放资源或写入日志等。...以上是本文对如何捕捉和处理SIGINT信号的详细阐述,代码示例中演示了如何定义信号处理函数、注册信号处理函数、使用原子操作保证程序安全退出、以及防止重复信号产生等。

    79320

    【Linux探索学习】第二十八弹——信号(下):信号在内核中的处理及信号捕捉详解

    在这篇文章中,我们将深入探讨 Linux 信号在内核中的处理流程,详细讲解信号递达、信号阻塞、未决信号、信号集操作、信号捕捉等内容,并通过大量的代码示例和实际场景来展示信号如何在 Linux 中运作...信号的处理流程在 Linux 内核中被设计得非常灵活,既支持异步信号处理,又能通过进程的信号屏蔽机制来控制信号的递达。...如果信号被阻塞,它将在信号屏蔽字解除后递达。 2. 信号捕捉与处理 信号捕捉是指进程通过自定义信号处理函数来响应特定的信号。...Linux 提供了 signal() 和 sigaction() 两种方式来捕捉信号。...2.1 使用 signal() 捕捉信号 signal() 是最基础的信号捕捉方式,它允许开发者指定一个信号处理函数来响应特定信号。

    21510

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

    : 忽略此信号 执行该信号的默认处理动作 提供一个信号处理函数,要求内核在处理该信号时切换到用户态执行这个处理函数,这种方式称为捕捉(Catch)一个信号 2.产生信号 2.1 通过终端按键产生信号...再比如当前进程访问了非法内存地址,MMU会产生异常,内核将这个异常解释为SIGSEGV信号发送给进程 2.4.1 信号捕捉初识 #include #include Linux是这样实现的:常规信号在递达之前产生多次只计一次,而实时信号在递达之前产生多次可以依次放在一个队列里 3.3 sigset_t 从上图来看,每个信号只有一个bit的未决标志,非0即1,不记录该信号产生了多少次...信号没有阻塞 4.捕捉信号 4.1 内核如何实现信号的捕捉 如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号 由于信号处理函数的代码是在用户空间的,处理过程比较复杂,举例如下...此方法对于Linux可用,但不保证在其它UNIX系统上都可用 测试代码 #include #include #include #include

    58510
    领券