首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C++中,当ctrl-c中断时,在死前调用带有参数(信号号除外)的函数。

在C++中,当ctrl-c中断时,在死前调用带有参数(信号号除外)的函数。
EN

Stack Overflow用户
提问于 2013-10-14 18:15:28
回答 2查看 3.4K关注 0票数 3

我想在程序结束前用ctrl中断文件时,再写几行到文件中。但是,文件的位置不是硬编码的,所以我需要的不仅仅是正常的中断处理as explained here。做这件事最好的方法是什么?

动机:

我在做时间相关的有限元模拟。有时,我忘记或错误估计了一个合理的tmax,而模拟需要很长时间才能完成,所以我用ctrl中断了它。但是,我仍然希望使用在此之前生成的数据。特别是,有一个xml文件,需要在模拟完成后追加几行来关闭标记。当然,手工操作是可能的,但这是一种痛苦,所以我尝试将其自动化。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-14 18:34:02

根据"How can I catch a ctrl-c event? (C++)“的答案,我们可以安装一个信号处理程序,它只会引发异常。然后我们可以捕获异常并运行任何我们喜欢的标准c++代码。

下面是一个有用的例子:

代码语言:javascript
运行
复制
#include <iostream>
#include <exception>
#include <signal.h>
#include <stdlib.h>


class InterruptException : public std::exception
{
public:
  InterruptException(int s) : S(s) {}
  int S;
};


void sig_to_exception(int s)
{
  throw InterruptException(s);
}


int main()
  {
    // Taken from answer to "How can I catch a ctrl-c event? (C++)"
    struct sigaction sigIntHandler;
    sigIntHandler.sa_handler = sig_to_exception;
    sigemptyset(&sigIntHandler.sa_mask);
    sigIntHandler.sa_flags = 0;
    sigaction(SIGINT, &sigIntHandler, NULL);


    try
      {
        std::cout << "Inside try" << std::endl;

        // Do something with output so the loop doesn't get optimised out
        double i = 0;
        while(i < 1e30) {i++;} // loop until interrupted
        std::cout << i << std::endl;
      }
    catch(InterruptException& e)
      {
        std::cout << "Write something to file" << std::endl;
        std::cout << "Caught signal " << e.S << std::endl;
        return 1;
      }

    return 0;
  }

这种方法至少有一个缺点:在尝试中安装了处理程序之后,我们必须包装所有的东西,否则中断信号将导致abort()。

票数 6
EN

Stack Overflow用户

发布于 2013-10-14 18:36:36

基于循环的科学代码的一个常见方案是具有全局易失性sig_atomic_t布尔值,指示信号是否被捕获并将其添加到循环条件中。

例如:

代码语言:javascript
运行
复制
volatile sig_atomic_t interrupted=false; 
...
void signal_handler(int s)
{
   // ...
   interrupted=true;
}
...
while (!converged && !interrupted)
{
     // Perform computations
}
// Save file properly
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19366503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档