执行默认信号处理程序

2024-01-14

我编写了一个应用程序,其中我为 linux 中的不同信号注册了多个信号处理程序。 进程接收到信号后,控制权将转移到我注册的信号处理程序。在这个信号处理程序中,我做了一些我需要做的工作,然后我想调用默认信号处理程序,即SIF_DFL or SIG_IGN。 然而,SIG_DFL and SIG_ING都是分别扩展为数值 0 和 1 的宏,它们是无效的函数地址。

有什么方法可以调用默认操作,即SIG_DFL or SIG_IGN ?

为了达到这样的效果SIG_DFL or SIG_ING我分别调用 exit(1) 和不执行任何操作。但对于像这样的信号SIGSEGV我也想要核心转储。 一般来说,我希望我的默认行为与SIG_DFL并忽略相同的行为SIG_IGN,就像操作系统所做的那样。


GNU C 库参考手册 http://www.gnu.org/software/libc/manual/html_node/Signal-Handling.html有整整一章解释了有关信​​号处理的所有内容。

当您安装自己的处理程序时,您总是会获得先前设置的信号处理程序(函数指针)(请参阅手册页signal() or sigaction()).

previous_handler = signal(SIGINT, myhandler);

一般规则是,您始终可以重置到以前的处理程序并raise()再次发出信号。

void myhandler(int sig) {
  /* own stuff .. */
  signal(sig, previous_handler);
  raise(sig);
  /* when it returns here .. set our signal handler again */
  signal(sig, myhandler);
}

有一个坏处一般规则:映射到信号的硬件异常通常被分配给导致异常的特定指令。因此,当您再次发出信号时,相关指令与原来的指令不同。这可能但不应该损害其他信号处理程序。

Another 坏处也就是说,每个升高的信号都会导致大量的处理时间。为防止过度使用raise()您可以使用以下替代方案:

  1. 的情况下SIG_DFL函数指针指向地址0(这显然不是有效的地址)。这样,你have to重置处理程序并raise()再次发出信号。

    if (previous_handler == SIG_DFL)
    {
      signal(sig, SIG_DFL);
      raise(sig);
      signal(sig, myhandler);
    } 
  2. SIG_IGN有价值1(也是无效地址)。在这里你可以直接返回(什么也不做)。

    else if (previous_handler == SIG_IGN)
    {
      return;
    } 
  3. 否则(既不SIG_IGN nor SIG_DFL)你已经收到一个有效的函数指针并且你can直接调用处理程序,

    else
    {
      previous_handler(sig);
    }

当然,您还必须考虑不同的 API(请参阅手册页signal() and sigaction()).

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

执行默认信号处理程序 的相关文章

  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 如何为 Linux 桌面条目文件指定带有相对路径的图标?

    对于我的一个 Linux 应用程序 我有应用程序二进制文件 一个 launcher sh 脚本 针对 LD LIBRARY PATH 和一个 desktop 文件 所有这些都位于同一文件夹中 我想使用图标的相对路径而不是绝对路径 我试过了
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 包含未定义

    澄清一下 Security 是项目文件夹 Accounts 是应用程序 我确信这是我忽略的一个基本问题 但我一直在努力让我的 manged py 命令正常工作 因为出现以下错误 NameError 名称 include 未定义 我的项目 安
  • 使用 href 上的 OAuth URL 链接到 Google OAuth 登录 UI 是否正确

    直接链接Google OAuth URL是否正确 ex 由我的 使用 Google 登录 链接上的 Google 库生成 就像目前 用户首先单击我的 使用 Google 登录 按钮 然后用户转到 authurl 生成器脚本 然后他获得 Go
  • 文件描述符和文件指针有什么区别? [复制]

    这个问题在这里已经有答案了 可能的重复 文件描述符和文件指针有什么区别 https stackoverflow com questions 2423628 whats the difference between a file descri
  • 杰克逊条件@JsonUnwrapped

    我可以有条件地使用 JsonUnwrapped吗 我不想在序列化期间使用它 但想在反序列化对象时使用它 一种方法是创建两个不同的类或创建一个子类来覆盖在序列化和反序列化时需要表现不同的属性 这听起来不对 还有其他替代方案或杰克逊解决问题的方
  • html 表格内的间距

    如何增加此表 第 1 行 第 1 单元格 中的空间 table border 1 tr td Row 1 cell 1 td td Row 1 cell 2 td tr table 请在此处检查图像 http img227 imagesha
  • 如何使用 XSLT 生成 HTML 表单?

    我有一张表格要填写
  • 您可以在 GAE 灵活环境中使用部分 vCPU 吗?

    我正在将应用程序从 GCE 转换为 GAE Flex 它目前在 g1 small 实例中运行 这足以满足我的需求 但是当我尝试在我的实例中指定 g1 small 实例时app yaml resources cpu 0 5 memory gb
  • java - arraylist 检查元素是否存在,忽略大小写

    您好 我有一个数组列表 它存储字符串值 我想检查列表中是否存在某个字符串 在这里我想忽略区分大小写 code public static ArrayList lt String gt arrFoodItems new ArrayList l
  • 使用 GCC 和 GDB (CodeBlocks)“警告:无法找到值 XXX 值的虚拟表的链接器符号”

    我收到一个运行时错误 内存无法写入 在通过调试器检查后 导致标题中出现警告 标头如下 组件 h ifndef COMPONENTE H define COMPONENTE H using namespace std class compon
  • 如何将 .chm 帮助文件添加到 Lazarus 构建的应用程序中?

    我可以在网上找到的唯一文档将我指向一个名为的演示应用程序Ihelp在我的 Lazarus 版本 v1 2 4 中似乎不存在 我已经创建了 chm 帮助文件 只是想让它在用户按 F1 或从弹出菜单中选择 帮助 时可用 FCL中有一个CHM组件
  • vector::iterator - 无效? [复制]

    这个问题在这里已经有答案了 可能的重复 g 不是类型 错误 https stackoverflow com questions 1301380 g is not a type error 以下内容无法编译 1 template
  • 当锁屏出现时 Android 启动意图

    我正在尝试开发替代锁屏 因为我需要一个意图过滤器来监听屏幕关闭 但问题是我不知道要使用哪个属性以及要给出哪个值 也在做同样的事情 这就是问题 https stackoverflow com questions 10800683 androi
  • 为什么使用 Java 套接字永远无法到达输入流的末尾?

    我正在用 Java 编写一个简单的代理 我无法将整个给定请求读入字节数组 具体来说 在下面的循环中 即使客户端已发送了它将发送的所有数据 即永远不会到达流的末尾 对 read 的调用也会阻塞 由于在读取完整的输入之前我无法确定是否是开始写入
  • 如何让数据对齐到html表格行的顶部

    我有这个 html 表 其中表中有一个单元格rowSpan 3 因此 在第一列中 我有 3 行带有输入 在第二列中 我有一张显示跨越所有 3 列的图片 我试图弄清楚浏览器如何计算出如何为第一列中的每一行垂直分配间距 然后我想变得 紧 这样所
  • 使用本地文件在远程数据库中执行 COPY 命令

    我正在尝试执行 PostgresCOPY命令 COPY warehouse terminal test table FROM C file csv DELIMITERS E t CSV HEADER QUOTE E ESCAPE E NUL
  • 使用 Json.NET 从 Json String 反序列化嵌套 DataSet

    我尝试使用 Json NET 从 JSON 字符串反序列化数据集 Json 字符串包含我想要使用的状态 消息和表 status ok message table column1 value1 column2 value2 column1 v
  • 该网站如何知道我正在打开另一个选项卡?

    当我登录一个网站 这是我大学的 学习系统 时 我发现我无法打开打开同一网站的新选项卡 当我这样做时 该网站不知何故会意识到并显示以下消息 该网站到底如何知道我在计算机上打开了哪些选项卡 据我所知 前端代码不应该访问我的私人浏览器信息 该网站
  • Jquery hasClass + If 语句

    我希望以下 loadContent 函数仅在单击的链接具有特定类时加载目标 div 这是我到目前为止所想出的 function loadContent targetDIV sourceURL if this hasClass done ta
  • 如何清理 TeamCity 中旧的失败构建?

    我们在 TeamCity 中确实有数百个失败的构建 由于旧的失败设置重试 数量特别高 现在浏览历史记录非常痛苦 我只想清理旧的失败构建 TeamCity 中有办法做到这一点吗 正常的清理策略只允许在上次成功构建之前的 X 天进行清理 在 T
  • 执行默认信号处理程序

    我编写了一个应用程序 其中我为 linux 中的不同信号注册了多个信号处理程序 进程接收到信号后 控制权将转移到我注册的信号处理程序 在这个信号处理程序中 我做了一些我需要做的工作 然后我想调用默认信号处理程序 即SIF DFL or SI