linux 信号signal

2023-11-01

信号处理函数

linux c提供了两个信号处理函数SIG_IGN、SIG_DFL。

  1. SIG_IGN:忽略信号
  2. SIG_DFL:信号默认处理函数
  3. 自定义处理函数:通过signal或sigaction注册自定义信号处理函数

注:信号SIGKILL、SIGSTOP不可捕获、不可忽略。

打印堆栈

#include <stdio.h>
#include <signal.h>
#include <execinfo.h>

void sigsegv_handler(int signum) {
    void *array[10];
    size_t size;
    char **strings;
    size_t i;

    // 获取堆栈信息
    size = backtrace(array, 10);
    strings = backtrace_symbols(array, size);

    printf("Received SIGSEGV signal. Printing stack trace:\n");
    for (i = 0; i < size; i++) {
        printf("%s\n", strings[i]);
    }

    free(strings);

    // 执行默认的SIG_DFL处理函数
    signal(SIGSEGV, SIG_DFL);
    raise(SIGSEGV); // 触发SIGSEGV信号,执行默认处理函数
}

int main() {
    // 设置SIGSEGV信号的处理函数为sigsegv_handler
    struct sigaction sa;
    sa.sa_handler = sigsegv_handler;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;
    sigaction(SIGSEGV, &sa, NULL);

    // 产生SIGSEGV信号
    int *ptr = NULL;
    *ptr = 10;

    return 0;
}

在上述代码中,我们定义了一个sigsegv_handler函数作为SIGSEGV信号的处理函数。在该处理函数中,我们使用backtrace函数获取当前的堆栈信息,并使用backtrace_symbols函数将堆栈信息转换为可读的字符串数组。然后,我们打印堆栈信息,并释放字符串数组的内存。

接下来,我们使用signal函数将SIGSEGV信号的处理函数设置为sigsegv_handler,并使用raise函数手动触发SIGSEGV信号,以执行默认的SIG_DFL处理函数。

在main函数中,我们设置了SIGSEGV信号的处理函数为sigsegv_handler,然后故意产生了一个SIGSEGV信号,通过访问一个空指针来触发。

当运行上述代码时,如果程序收到SIGSEGV信号,它将首先打印堆栈信息,然后执行默认的SIG_DFL处理函数,通常是终止程序的执行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux 信号signal 的相关文章

  • copy_from_user() 错误:目标大小太小

    我正在为内核模块编写 ioctl 处理程序 我想从用户空间复制数据 当我编译禁用优化的代码时 O0 gflags 编译器返回以下错误 include linux thread info h 136 17 error call to bad
  • 非模板函数中的尾随返回类型[重复]

    这个问题在这里已经有答案了 我见过有人使用以下语法来实现函数 auto get next gt int 代替 int get next 我理解两者 并且我知道尾随返回类型语法对于使用 decltype 的模板代码很有用 就我个人而言 我会避
  • 无法在 CUDA 中找到 1 到 100 数字的简单和?

    我正在研究使用 CUDA 的图像处理算法 在我的算法中 我想使用 CUDA 内核找到图像所有像素的总和 所以我在cuda中制作了内核方法 来测量16位灰度图像的所有像素的总和 但我得到了错误的答案 所以我在cuda中编写了一个简单的程序来查
  • 如何使用T4从一个模板同时生成两个文件?

    我遇到的情况是 我需要生成两个 CSharp 代码文件 它们的代码几乎相同 但方法的输入和输出类型的命名空间不同 事实上 每个文件都针对特定国家 地区 并且类型来自特定国家 地区的 WSDL 我正在围绕服务编写一些包装器 逻辑完全相同 但从
  • 在linux中将包含word的行从一个文件复制到另一个文件

    我想复制包含某些单词的行file1 to file2 Suppose file1 ram 100 ct 50 gopal 200 bc 40 ravi 50 ct 40 krishna 200 ct 100 file2应该只有包含 ct 的
  • 加载 QPixmap 数据的更好方法

    更好的方法来做到这一点 没有QImage QImage image width height QImage Format RGB888 memcpy image bits m frameRGB gt data 0 height width
  • ASP.NET - Crystal Report Viewer 打印按钮在 ASP.NET 中不起作用

    我正在使用 Visual Studio 2008 但我遇到了水晶报告问题 当我单击打印按钮时 它会将我带到弹出窗口 但未找到页面 弹出的网址是 http localhost aspnet client System Web 2 0 5072
  • 使用 STL 流时如何格式化我自己的对象?

    我想将我自己的对象输出到 STL 流 但具有自定义格式 我想出了这样的东西 但由于我之前从未使用过 locale 和 imbue 所以我不知道这是否有意义以及如何实现 MyFacet 和operator 所以我的问题是 这是否有意义以及如何
  • 当我尝试传递临时地址作为参数时,它是一个 UB 吗?

    对于以下 C 代码 include
  • 更改私有模块片段是否会导致模块重新编译?

    On 此页面有关 C 20 模块功能 https www modernescpp com index php c 20 modules private module fragment and header units 我发现了这样的说法 借
  • 如何从 Powerpoint 2010 导出电影?

    如何使用 MS Office PIA 主互操作程序集 或其他方式以编程方式将嵌入视频从 powerpoint 2010 导出到外部文件 在演示文稿中嵌入视频是 Powerpoint 2010 中的一项新功能 我找不到解决方案 PPTX 文件
  • 为什么连续抛出 2 个异常不会生成无法访问的代码警告?

    为什么以下代码行不会创建编译器警告 void Main throw new Exception throw new Exception 据我所知 编译器应该通知您无法到达第二个抛出异常 这显然是一个编译器错误 它是在 C 3 0 中引入的
  • main.cpp 是必需的吗?

    我试图编译一个程序cmake 我最终删除了我的main cpp文件 我刚刚将其复合到另一个包含我的项目名称的文件中 即 我刚刚将主函数剪切并粘贴到该文件中 问题是我有一个main cpp未发现错误 不确定是否在C 一个名为main cpp是
  • MPI - 发送和接收列

    我需要从一个进程发送矩阵列并从另一个进程接收它 我尝试运行以下程序 但得到了一个奇怪的结果 至少我这么认为 仅复制矩阵的第一个元素 某些矩阵元素会发生意外变化 include
  • 在 clang 中向量化函数

    我正在尝试根据此用 clang 对以下函数进行矢量化铿锵参考 http llvm org docs Vectorizers html 它采用字节数组向量并根据以下条件应用掩码this RFC https www rfc editor org
  • 具有多个父项的 Qt 树模型

    我想构建一棵树 其中一个元素可以引用另一个元素 我想要构建的树是 像这样的东西 A B C D E F P this is a pointer to C D first child of C E second child of C I fo
  • C# 多维数组解析

    我有一个多维数组 内容在调试器中看起来像这样 数组设置为 String s new String 6 4 A B Yes C A B Yes C A B No C A B Yes C A B Yes C A B Yes C A B No C
  • 为什么存在系统调用

    我一直在阅读有关系统调用及其在 Linux 中如何工作的内容 我还有更多的阅读要做 但我读过的一件事都没有回答 那就是 为什么我们需要系统调用 我知道系统调用是用户空间程序要求内核执行某些操作的请求 但我的问题基本上是 为什么用户空间程序本
  • 异步/等待 - 是*并发*吗?

    我一直在考虑 C 5 中新的异步内容 并且出现了一个特殊问题 据我了解 await关键字是一个简洁的编译器技巧 语法糖来实现连续传递 http en wikipedia org wiki Continuation passing style
  • 如何配置 qt Creator 以显示 C++ 代码而不是反汇编程序?

    昨天我做了很多事情 比如更新 GCC Clang 和重新安装 Qt Creator 今天 在逐步调试我的代码时 调试器显示的是反汇编代码 而不是我编写的 C 代码 紧迫F10 or F11 调试器正在进入汇编代码而不是 cpp nor h我

随机推荐

  • Java内存分析

    程序的内存分配 一个由C C 编译的程序占用的内存分为以下几个部分 1 栈区 stack 由编译器自动分配释放 存放函数的参数值 局部变量的值等 其操作方式类似于数据结构中的栈 2 堆区 heap 一般由程序员分配释放 若程序员不释放 程序
  • 若依前端不分离-代码生成

    1 添加菜单 刷新网页后新建的菜单栏就会出现左侧 2 创建数据库表 需要注意的是 表要创建在工程引用的数据库中 另须注意 给重要的字段添加注释 参考后面第11条 3 在若依界面中导入表结构 4 首先点击编辑 将必须填写的选项补充完整 然后点
  • Android平台上最好的几款免费代码编辑器

    概述 使用正确的开发工具能够快速有效地完成源代码的编写和测试 使编程事半功倍 这里介绍了在Android平台上5款最好的代码编辑器 帮助你作出选择 使用正确的开发工具能够快速有效地完成源代码的编写和测试 使编程事半功倍 在网络信息高速发展的
  • 20230703

  • Linux 小插件 lrzsz epel-release

    装lrzsz的作用 就可以直接把windows上面想要装到linux上的东西直接拖拽就可以了 命令 sudo yum install lrzsz 解释 rz 是 receive zmodem 的缩写 中文含义为 接收ZMODEM 这里的接受
  • Python二级(13)——Python第三方库纵览

    一 知识导图 二 网络爬虫方向 1 网络爬虫是自动进行HTTP访问并捕获HTML页 面的程序 Python语言提供了多个具备网络爬 虫功能的第三方库 这里 仅介绍2个常用的 Python网络爬虫库 r e q u
  • JavaWeb学习笔记 day01 HTML 和 CSS

    文章目录 JavaWeb学习笔记 day01 HTML 和 CSS 1 任务 2 课堂笔记 2 1 B S 软件的结构 2 2 前端的开发流程 2 3 网页的组成部分 2 4 HTML 简介 2 5 创建 HTML 文件 2 6 HTML
  • QT 之 QByteArray

    QByteArray类 提供一个字节数组 QByteArray可用于存储原始字节 包括 0 和传统的8位 0 端接字符串 使用QByteArray比使用const char 更方便 除了QByteArray之外 Qt还提供了QString类
  • 成语学习微信小程序源码

    一个学习成员的小程序 分享给大家学习 体验方式 源码下载 链接 https pan baidu com s 1T1q970BTnQxyflzpSlgp8g 提取码 jfcj
  • element 全局$message使用方法(vue中使用和js中使用)

    main js 内配置 import Message from element ui 挂载到 message上 Vue prototype message Message vue中使用 this message warning 111111
  • 使用ffmpeg转换webm格式到MP4格式

    1 cmd 2 切换到ffmpeg安装目录 cd C Program Files x86 Apowersoft Video Editor Pro 3 输入命令 ffmpeg i D djivideos 004 webm b v 2000k
  • python错误--‘list‘ object is not callable可能的原因之一

    目录 第一 代码 第二 第一 代码 功能说明 用正则表达式匹配数字并对数字进行 1操作 然后替换原数字 str literal books 1000 def add1 match val match group num int val 1
  • ❤️如何用Python绘制一个飞机模型??

    VTK在Java Tcl Python中都有接口 本文介绍VTK在Python中的接口 VTK The Visualization Toolkit 是一款用于计算机3D成像 构建模型 图像处理 容积渲染 科学数据可视化等方面的免费软件系统
  • 手把手教你如何使用iometer测试工具测试存储

    原文链接 http www 56itc com index php archives 303 本文主要介绍为广大服务器和存储厂商采用的磁盘性能测试工具 iometer 在 Linux 和 Windows 平台上的安装使用和测试方法 并且对典
  • do msgbox loop_西门子数字量DO扩展模块SM1222

    西门子数字量DO扩展模块SM1222 上海耿湘自动化设备中心是一家集工控产品销售ATV12P075M3 ATV12P037M3施耐德变频器代理商自动化工程设计 开发 改造为一体的高新科技企业 我公司拥有的队伍 针对多种行业自动化的工艺控制需
  • 第九篇 GoogLeNet——论文翻译

    文章目录 摘要 1 引言 2 近期工作 3 动机和高层思考 4 架构细节 5 GoogLeNet 6 训练方法 7 ILSVRC 2014分类挑战赛设置和结果 8 ILSVRC 2014检测挑战赛设置和结果
  • 中大型企业网络规划设计与网络安全实施实战(附topo实验配置环境)

    用户需求 用户隔离 IT VLAN10 HR VLAN20 主机地址通过DHCP方式获取地址 可以通过手工配置地址方式进行测试 网关部署在汇聚层 网关可以进行备份 冗余 VRRP 根据不同VLAN 进行负载 汇聚交换机互联链路 冗余捆绑 e
  • FastAPI从入门到实战(7)——请求体函数的参数设置

    上一篇记录了FastAPI中声明请求体的相关内容 本文记录一下零碎的函数特性和参数特性相关内容 Pydantic schema extra 可以使用 Config 和 schema extra 为Pydantic模型声明一个示例 class
  • java 的 native 方法

    一 概念 一个 Native Method 就是一个 java 调用非 java 代码的接口 一个 Native Method 是这样一个 Java 方法 该方法的实现由非 java 语言实现 有可能是 C 语言实现的 在定义一个 nati
  • linux 信号signal

    信号处理函数 linux c提供了两个信号处理函数SIG IGN SIG DFL SIG IGN 忽略信号 SIG DFL 信号默认处理函数 自定义处理函数 通过signal或sigaction注册自定义信号处理函数 注 信号SIGKILL