iis服务器助手广告
返回顶部
首页 > 资讯 > 操作系统 >Linux如何实现信号捕捉
  • 812
分享到

Linux如何实现信号捕捉

2023-06-15 19:06:11 812人浏览 独家记忆
摘要

这篇文章主要介绍了linux如何实现信号捕捉,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。##signal函数函数原型:sighandler_t signal(in

这篇文章主要介绍了linux如何实现信号捕捉,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

##signal函数

函数原型:

sighandler_t signal(int signum, sighandler_t handler);

其中,sighandler定义是这样的:typedef void (*sighandler_t)(int);

函数作用:注册一个信号捕捉函数,也就是说,收到了某个信号,就执行它所注册的回调函数。

函数参数:

  • signum:信号编号,尽量用宏来写,而别用数字,这样更适合跨平台;

  • handler:注册的回调函数;

函数缺陷:

由于历史原因,该函数在不同版本的Unix和Linux系统中可能起到的效果不一样,所以跨平台性不佳,尽量避免使用它,取而代之使用通用性更好的sigaction函数。

 #include <stdio.h>  #include <signal.h>   void func()  {      printf("SIGQUIT catched!\n");  }   int main() {     signal(SIGQUIT, func);     while(1); }

##sigaction函数

函数原型:

int sigaction(int signum, const struct sigaction act, struct sigaction oldact);

函数作用:与signal函数类似,用来注册一个信号捕捉函数;

返回值:

成功:0;失败:-1,并设置errno;

参数:

  • signum:信号编号,尽量用宏来写,而别用数字,这样更适合跨平台;

  • act:传入参数,新的信号捕捉方式;

  • oldact:传出参数,旧的信号捕捉方式

这里特别要注意参数中struct sigaction结构体,这也是这个函数的难点所在,下面详细说明:

struct sigaction结构体

原型:

struct sigaction {  void (*sa_handler)(int);  void (sa_sigaction)(int, siginfo_t , void *);   sigset_t sa_mask;   int sa_flags;   void (*sa_restorer)(void);  };

这个结构体成员很多,又很多是回调函数的形式,令人望而生畏。但实际上,需要掌握的只有三个。

首先,sa_restorer和sa_sigaction这两个成员一个已经被弃用了,另一个很少使用,所以我们暂且不管它们,重点掌握剩下的三个。

(1) sa_handler:指定信号捕捉后的处理函数,即注册回调函数。该成员也可以赋值为SIG_IGN,表示忽略该信号,也可注册为SIG_DFL,表示执行信号的默认动作。

(2) sa_mask:临时阻塞信号集(或信号屏蔽字)先来看这样一个情景:

某个信号已经注册了回调函数,当内核传递这个信号过来时,会先经过一个阻塞信号集,先阻塞掉部分信号。再去执行对应的回调函数。如下图示:

Linux如何实现信号捕捉

假如说,这个回调函数回调执行的时间比较长,比如2秒,在这2秒里,又有其它的信号过来,那进程是暂停当前回调函数,去响应新的信号,还是不管新来的信号,先把当前回调函数处理完再说?

正确的做法是,在执行回调函数期间,使用sa_mask临时的去替代进程的阻塞信号集,保证回调函数安心的执行完毕,再解除替代。注意:这个过程仅仅发生在回调函数执行期间,是临时性的设置。

(3) sa_flags:通常设置为0,表示使用默认属性。

再来看另外一个场景:

比如进程对SIGQUIT注册了回调函数,当回调函数在执行期间,又来了SIGQUIT函数,这时,进程是响应还是不响应该信号?这就是sa_flags的一个作用,当其设置为0时,表示使用默认属性,也就是先不响应该信号,而是执行完回调函数再处理此信号。

另外,阻塞的常规信号不支持排队,也就是说,执行回调函数期间,再来千百个同个信号时,系统只记录一次。而后面的32个实时信号则支持排队。

 #include <stdio.h>  #include <signal.h>  #include <unistd.h>   void func(int signal)  {      printf("SIGQUIT catched!\n");      sleep(2);   //用来模拟回调函数执行很长时间      printf("func finished!\n"); }  int main() {     struct sigaction act;     act.sa_handler = func;     sigemptyset(&act.sa_mask);  //先清空临时阻塞信号集     sigaddset(&act.sa_mask, SIGINT);    // 执行回调函数期间,屏蔽SIGINT     act.sa_flags = 0;      sigaction(SIGQUIT, &act, NULL); //注册回调函数      while(1);      return 0; }

感谢你能够认真阅读完这篇文章,希望小编分享的“Linux如何实现信号捕捉”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网操作系统频道,更多相关知识等着你来学习!

--结束END--

本文标题: Linux如何实现信号捕捉

本文链接: https://www.lsjlt.com/news/281392.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Linux如何实现信号捕捉
    这篇文章主要介绍了Linux如何实现信号捕捉,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。##signal函数函数原型:sighandler_t signal(in...
    99+
    2023-06-15
  • shell脚本中如何进行信号的捕捉
    本篇文章给大家分享的是有关shell脚本中如何进行信号的捕捉,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。trap从字面意思看就是就是陷阱的意思但是在shell脚本中trap时...
    99+
    2023-06-28
  • Linux怎么正确捕捉内核崩溃信息
    本文小编为大家详细介绍“Linux怎么正确捕捉内核崩溃信息”,内容详细,步骤清晰,细节处理妥当,希望这篇“Linux怎么正确捕捉内核崩溃信息”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。首先安装必选包:apt-g...
    99+
    2023-06-27
  • Python3如何实现捕获Ctrl+C终止信号
    技术背景针对长时间运行的Python程序,例如服务器的后端或科学计算程序,需要特别关注。在进行某些操作时,如使用Ctrl+C结束正在运行的程序,我们可能需要提前中止。通常情况下,出现这种情况有两种可能性:一种是程序出错,需要停止程序以进行调...
    99+
    2023-05-21
    Python
  • react native如何捕捉错误
    这篇文章主要介绍“react native如何捕捉错误”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“react native如何捕捉错误”文章能帮助大家解决问题。react native捕捉错误的方...
    99+
    2023-07-04
  • Android 是如何捕捉 java 异常的
    目录一、java异常全局捕捉二、小知识1、如何捕获异常不退出2、如何捕获指定线程异常3、ThreadGroup和Thread的关系结构一、 java 异常全局捕捉 用于 java 异...
    99+
    2024-04-02
  • vue如何实现监听数值的变化并捕捉
    这篇文章主要介绍了vue如何实现监听数值的变化并捕捉的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue如何实现监听数值的变化并捕捉文章都会有所收获,下面我们一起来看看吧。1. 封装全局监听方法在main.js...
    99+
    2023-07-04
  • c#中nmodbus如何捕捉异常
    在C#中,可以使用try-catch语句块来捕捉Modbus通信中的异常。以下是一个示例代码,演示如何捕捉Modbus异常: usi...
    99+
    2024-04-02
  • VB.NET中怎么实现异常迭代捕捉
    VB.NET中怎么实现异常迭代捕捉,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。VB.NET异常迭代捕捉代码示例:Dim a As Integer...
    99+
    2023-06-17
  • Python3实现捕获Ctrl+C终止信号
    目录技术背景基础案例给终止信号传入外部参数总结概要技术背景 对于一些连续运行或者长时间运行的Python程序而言,如服务器的后端,或者是长时间运行的科学计算程序。当我们涉及到一些中途...
    99+
    2023-03-13
    Python捕获Ctrl+C终止信号 Python Ctrl+C终止信号 Python捕获信号
  • python如何捕捉屏幕上的文字
    要捕捉屏幕上的文字,你可以使用Python中的pytesseract库。pytesseract是一个OCR(光学字符识别)库,可以用...
    99+
    2023-10-18
    python
  • 怎么用Python代码实现微信消息撤回捕捉功能
    本篇内容介绍了“怎么用Python代码实现微信消息撤回捕捉功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1,模块介绍首先的话要实现消息撤...
    99+
    2023-06-16
  • vue实现监听数值的变化,并捕捉到
    目录上传头像的例子是完整的,登录没全部展示1. 封装全局监听方法2. 触发,并将监听的值存入Storage3. 监听完整例子(代码看上面 )第一步第二步第二步第三步上传头像的例子是完...
    99+
    2022-11-13
    vue监听 监听数值变化 vue捕捉数值
  • linux捕获信号的方法是什么
    在Linux中,捕获信号的方法有两种:1. 使用信号处理函数:可以通过使用signal()函数来注册信号处理函数,该函数的原型如下:...
    99+
    2023-08-12
    linux
  • oracle存储过程异常如何捕捉
    在Oracle中,可以使用异常处理来捕获存储过程中的异常。在存储过程中,可以使用以下语句来捕获异常并进行处理:sqlDECLARE ...
    99+
    2023-10-25
    oracle
  • cad鼠标捕捉老是跳动如何解决
    这篇文章主要介绍了cad鼠标捕捉老是跳动如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇cad鼠标捕捉老是跳动如何解决文章都会有所收获,下面我们一起来看看吧。cad鼠标捕捉老是跳动的解决办法:1、在电脑中...
    99+
    2023-07-05
  • Springboot利用Aop捕捉注解实现业务异步执行
    目录一、先说说线程的几种创建方式(简要列举)二、再聊一聊spring自带的@Async注解实现异步任务的方法三、那么就来设计一下怎么使用自定义的注解实现异步任务在开发过程中,尽量会将...
    99+
    2023-05-14
    Springboot业务异步执行 Springboot Aop捕捉注解
  • python简单实现对桌面进行实时捕捉画面
    介绍 最近在研究目标检测方面的小东西,需要到对桌面进行实时捕捉画面,获取画面后再检测,达到实时桌面目标检测的目的,所以写了一段小代码来实现该功能,实测速度很快,符合我的需求。特此记录一下。 代码 im...
    99+
    2023-08-31
    python
  • 如何使用golang函数闭包捕捉变量
    如何使用 go 函数闭包捕获变量?定义一个包含要捕获变量的函数参数。在函数体内,使用捕获的变量。示例:计数器闭包缓存闭包闭包在 go 中用于捕获变量并创建灵活和可重用的代码。 如何使用...
    99+
    2024-04-23
    golang 闭包
  • 在脚本中如何使用Bash信号捕获
    这篇文章将为大家详细讲解有关在脚本中如何使用Bash信号捕获,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Shell 脚本的启动并不难被检测到,但 Shell 脚本的终止检测却并不容易,因为我们无法确定脚...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作