如果发出 SIGINT 或 SIGSTP,是否会调用析构函数?

2024-01-16

我有一个带有用户定义析构函数的类。如果类最初被实例化,然后在程序运行时发出 SIGINT(在 unix 中使用 CTRL+C),析构函数会被调用吗? SIGSTP(unix 中的 CTRL + Z)的行为是什么?


不会,默认情况下,大多数信号都会导致程序立即异常退出。

但是,您可以轻松更改大多数信号的默认行为。

此代码显示如何使信号正常退出程序,包括调用所有常用的析构函数:

#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <cstring>
#include <atomic>

std::atomic<bool> quit(false);    // signal flag

void got_signal(int)
{
    // Signal handler function.
    // Set the flag and return.
    // Never do real work inside this function.
    // See also: man 7 signal-safety
    quit.store(true);
}

class Foo
{
public:
    ~Foo() { std::cout << "destructor\n"; }
};

int main(void)
{
    struct sigaction sa;
    memset( &sa, 0, sizeof(sa) );
    sa.sa_handler = got_signal;
    sigfillset(&sa.sa_mask);
    sigaction(SIGINT,&sa,NULL);

    Foo foo;    // needs destruction before exit
    while (true)
    {
        // do real work here...
        sleep(1);
        if( quit.load() ) break;    // exit normally after SIGINT
    }
    return 0;
}

如果运行该程序并按 Control-C,您应该会看到打印出“析构函数”一词。

请注意,除了设置标志并安静地返回之外,您的信号处理函数 (got_signal) 应该很少做任何工作,除非您真的知道自己在做什么。也可以看看:https://man7.org/linux/man-pages/man7/signal-safety.7.html https://man7.org/linux/man-pages/man7/signal-safety.7.html

大多数信号都是可捕获的,如上所示,但 SIGKILL 除外,您无法控制它,因为 SIGKILL 是终止失控进程的最后手段,而不是允许用户冻结进程的 SIGSTOP。请注意,如果需要,您可以捕获 SIGTSTP (control-Z),但如果您对信号唯一感兴趣的是析构函数行为,则不需要这样做,因为最终在 control-Z 之后,进程将被唤醒,将继续运行,并且将正常退出,并且所有析构函数都有效。

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

如果发出 SIGINT 或 SIGSTP,是否会调用析构函数? 的相关文章

  • 在哪里使用 EF6 订阅 ObjectMaterialized?

    我正在尝试将我的上下文订阅到以下 OnjectMaterialized 事件this https stackoverflow com a 3756842 2835713 像这样 IObjectContextAdapter this Obje
  • 从 Dropbox C# 下载文件[重复]

    这个问题在这里已经有答案了 我正在尝试下载 Dropbox 中的 pdf 文件 我需要将其保存到本地计算机中 可以是任何文件夹C Users User Desktop例如 这是我一直在使用的代码 public void DownloadPd
  • 在 C++ 中,当我将值传递给函数时,它是否总是转换为适当的类型?

    如果我有一个像这样的函数void func size t x 我称该函数为func 5 5 立即转换为size t类型 这通常适用于所有类型吗 我问这个问题是因为我发誓我见过人们编写代码 他们做类似的事情func 5 0 将 5 作为双精度
  • Windows 10 UWP 中的视觉状态管理器未在页面加载时应用初始状态

    我有一个带有相关面板的页面 可以根据宽度重新组织 但是 除非宽度 gt 720px 否则它似乎不会在加载时应用任何状态 如果我在加载页面后调整页面大小 则两种状态都有效 解决方法是检查加载页面上的窗口大小并手动选择状态 但我相信这应该自动处
  • MVC 中的 Blazor:组件被渲染,但 @onclick 不起作用。连接问题

    我正在尝试在 net core 3 MVC 项目中使用 Blazor 我使用了一些教程来做到这一点 例如https fizzylogic nl 2019 08 18 integrating blazor in an existing asp
  • 有没有办法让我的程序用更少的代码运行?

    我为学校作业编写了以下代码 它编译并打印所有正确的消息 但出于我自己的好奇心 我想知道我的代码是否可以缩短并且仍然有效 我尝试了 signal 而不是 sigaction 但我听说 sigaction 比 signal 更受青睐 此外 此任
  • 如何自定义 ASP.Net Core 模型绑定错误?

    我只想从我的 Web API Asp net Core 2 1 返回标准化的错误响应 但我似乎不知道如何处理模型绑定错误 该项目刚刚从 ASP NET Core Web 应用程序 gt API 模板创建 我有一个简单的操作定义为 Route
  • Visual Studio 2015 C# 找不到参考

    我在使用 Visual Studio 2015 和 C 时遇到了问题 在同一解决方案中添加对其他项目的引用时 Visual Studio 找不到所有类 例如 我创建了一个单元测试项目 我添加了对我创建的通信项目的引用 库中有 10 个类 但
  • Docker 不遵循构建目录中的符号链接

    我正在对一个应用程序进行 Docker 化 其中涉及通过 Clang 将二进制文件与其他 C 文件链接 我们维护二进制文件的符号链接版本 因为它们在整个代码库中使用 我的 Docker 构建目录包含整个代码库 包括源文件以及这些源文件的符号
  • C++ 虚拟关键字与重写函数

    我正在学习c 并且正在学习virtual关键字 我在互联网上搜索试图理解它但无济于事 我进入编辑器并做了以下实验 期望它打印两次基本消息 因为我的印象是需要 virtual 关键字来覆盖函数 然而 它打印出了两条不同的消息 有人可以向我解释
  • 在 OpenGL 中使用不同的着色器程序?

    我必须在 OpenGL 中针对不同的对象使用两个不同的着色器程序 我发现我必须使用glUseProgram 在不同的着色器程序之间切换 但对此没有太多信息 鉴于我有两个用于不同对象的不同着色器程序 如何为每个着色器程序生成和绑定 VAO 和
  • 当 C 中没有足够的内存用于静态分配时会发生什么?

    当您动态分配内存时 例如malloc 1024 sizeof char 结果指针设置为NULL如果没有足够的可用内存来满足请求 当没有足够的内存来满足静态分配时会发生什么 例如char c 1024 char c 1024 不一定是静态分配
  • 如何在 C 预处理器中可靠地检测 Mac OS X、iOS、Linux、Windows? [复制]

    这个问题在这里已经有答案了 如果有一些跨平台 C C 代码需要在 Mac OS X iOS Linux Windows 上编译 我如何在预处理器过程中可靠地检测到它们 大多数编译器都使用预定义的宏 您可以找到列表here http sour
  • 更改成员资格、角色等的默认连接字符串

    默认情况下 我的网络应用程序似乎正在使用LocalSqlServer作为用于任何应用程序服务 例如成员资格 角色 身份验证 等 的连接字符串 有什么方法可以更改默认连接字符串应该是什么 默认值是 LocalSqlServer 似乎很随意 我
  • PARITY_NONE 是 C++ Windows 中的关键字吗?

    我正在使用 boost 编写一个串行库 并且我有一个枚举 enum parity t PARITY NONE PARITY ODD PARITY EVEN 我收到如下错误 错误 1 错误 C2059 语法错误 我无法弄清楚问题是什么 然后我
  • std::iota 的 iota 代表什么?

    我假设 i 是增量 a 是分配 但我无法弄清楚或找到答案 而且 它看起来与非标准非常相似itoa我认为这很令人困惑 C iota is not an acronym or an initialism It is the word iota
  • 使用 QTestLib 时抑制 qDebug

    我正在向 Qt 中的项目添加单元测试 并希望使用 QTestLib 我已经设置了测试并且它们运行良好 问题是在项目中我们重写了 qDebug 以输出到我们自己的日志文件 这在运行应用程序时效果很好 问题是当我测试类时 它有时会开始记录 然后
  • WPF DataGrid 选定项

    我有一个 DataGrid 用户可以通过在最后一行输入数据来添加项目 我还有一个按钮可以删除当前选定的项目 但是 当选择最后一行 空 用于添加新项目 时 最后选定的项目将保留在 SelectedItem 中 因此 如果我打开窗口 选择最后一
  • 如何在您的网站中连接两个人

    有一款名为 Verbosity 的游戏 这是一款有目的的游戏 位于此链接上www gwap com 在游戏中 他们随机连接两个玩家互相玩 游戏是玩家1应该向他的搭档 玩家2 描述一个单词 而玩家2应该猜测这个单词 我正在尝试建立一个网站来执
  • ASP.NET API:尚未为此 DbContext 配置数据库提供程序

    我正在尝试从我的 Net Core API 项目连接到 MySql 数据库 这是我的上下文类 public class MyContext DbContext public MyContext public MyContext DbCont

随机推荐

  • 为什么我无法将node_modules文件上传到GitHub存储库?

    我有一个使用 Angular 6 编写的项目 我想将该项目上传到 GitHub 但是当我使用 GitHub Desktop 上传该项目时 除了 node modules 文件之外的所有文件都会上传 当我从 GitHub 下载项目并尝试运行时
  • JTable 中的 JSlider

    用于放置一个JSlider into a JTable我写的是AbstractCellEditor它实现了一个TableCellRendererand a TableCellEditor 它使用 0 到 100 之间的值进行初始化 我有一个
  • 使用 SIFT 搜索图像数据库

    Several https stackoverflow com questions 1612037 comparing images using sift 问题 https stackoverflow com questions 15004
  • 在模式注册表中,消费者的模式可能与生产者的模式不同,这实际上意味着什么

    在向 Kafka 生成 AVRO 数据时 Avro 序列化程序在写入数据时使用的字节数组中写入相同的架构 ID Kafka Consumer 根据接收到的字节数组中的模式 ID 从模式注册表中获取模式 因此 生产者和消费者等模式都使用相同的
  • 该操作无法完成,因为 DbContext 已使用 MVC 4 进行处置

    我知道这个问题被问了很多次 我已阅读并实施了所有解决方案 但没有取得成功 当我使用 EF 从数据库检索数据并在视图上使用此模型后与模型绑定时 出现此错误 我的控制器代码是 using System Linq using System Web
  • 卸载 32 位应用程序并安装 64 位应用程序

    是否有可能告诉 Inno Setup 卸载应用程序的 32 位版本 通常驻留在Program Files x86 以便安装 64 位版本的应用程序 通常在Program Files 如果不卸载32位版本 那么它们的bot就会在启动时启动 从
  • 创建一个列来保存连续值的运行计数

    我正在尝试创建一个列 consec 它将在另一个列 二进制 中保留连续值的运行计数 而不使用循环 这就是期望的结果 binary consec 1 0 0 2 1 1 3 1 2 4 1 3 5 1 4 5 0 0 6 1 1 7 1 2
  • MySQL A 或 B,但不能同时两者

    这似乎是一个简单的查询 但我似乎无法理解它或将其与堆栈溢出上的其他帖子联系起来 谁能解释一下 这是我到目前为止所拥有的 它正在返回一个人或两个人去过的所有酒吧的记录 TBL 常见模式 饮酒者 VARCHAR 50 PK 酒吧 VARCHAR
  • 正则表达式 - 查找具有 name 属性但不具有 id 的元素

    这个问题今天就出现在我身上了 我正在从事一个基于 Web Struts 2 的项目 其中包含大量 JSP 并且大部分input select table and a元素仅通过以下方式定义name属性 无id设置 例如
  • 绕过 org.apache.hadoop.mapred.InvalidInputException:输入模式 s3n://[...] 匹配 0 个文件

    这是我的一个问题已经问过 http apache spark user list 1001560 n3 nabble com Ignoring S3 0 files exception tt6101 html在 Spark 用户邮件列表中
  • Android:同时视频播放和录制

    我正在为 Android 开发一个类似视频聊天的应用程序 我可以同时在屏幕上录制和播放视频吗 我可以将视频相互合成 FaceTime 风格 还是必须并排放置 我可以使用 MediaPlayer 和 MediaRecorder 类还是必须使用
  • Angular 5 - 在函数中使用时 Ng-x 微调器不显示

    我不确定是否有人经历过这种情况 每当我尝试在函数中使用 ngx spinner 时 它都不起作用 但是当我将它放入订阅的回调中时 它就起作用了 在 authservice 之外 这没有显示微调器 login this spinner sho
  • Python 解释器/IronPython 解释器没有名为 clr 的模块

    我正在使用 IronPython 我想创建一些窗口窗体 我想创建一个带有一些按钮的 Windows 窗体 并且我想在 Visual Studio 中使用 Iron Python 来执行此操作 我使用的是Visual Studio 2012集
  • 更新推送通知的实时应用程序 ID

    我在 App Store 中有一个应用程序 它有一个通配符应用程序 ID 我想向其添加推送通知 但不能 因为我们有通配符应用程序 ID 这是我得到的错误 只有显式应用程序 ID 才能用于访问 Apple 推送通知服务 请使用具有特定捆绑包标
  • 用新行替换字符

    Powershell ver 4 Windows 7 我想更换 在文本文件中添加新行 我尝试了下面的脚本 Get Content C Test test txt Replace n Set Content C Test testv2 txt
  • isset() 在表单上无法正常工作

    我有一个用户提交的注册表单 使用 isset POST 发送数据以查看是否有任何内容放入表单输入框中 如果没有 则将其发送到 else 然后将其发送到一个函数 该函数将用户返回到注册表以完成一些缺少的表单 由于某种原因它无法正常工作 这是我
  • Mongodb-在现有集合上添加唯一索引

    我正在尝试学习 Mongodb 中的索引 我创建了一个数据库和一个集合 如下所示 use mydb db createCollection myFirstCollection one name Helios two name Kepler
  • JavaFX 在场景图控件上循环

    如何循环控制场景 我尝试使用 getChildrenUnmodifying 但它仅返回第一级子级 public void rec Node node f node if node instanceof Parent Iterator
  • pytorch如何设置.requires_grad False

    我想冻结我的一些模型 按照官方文档 with torch no grad linear nn Linear 1 1 linear eval print linear weight requires grad 但它打印True代替False
  • 如果发出 SIGINT 或 SIGSTP,是否会调用析构函数?

    我有一个带有用户定义析构函数的类 如果类最初被实例化 然后在程序运行时发出 SIGINT 在 unix 中使用 CTRL C 析构函数会被调用吗 SIGSTP unix 中的 CTRL Z 的行为是什么 不会 默认情况下 大多数信号都会导致