gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:47:18 26 4
gpt4 key购买 nike

我想在程序结束前用 ctrl-c 中断时向文件写入一些额外的行。但是文件的位置不是硬编码的,所以我需要比正常中断处理更多的东西 as explained here .执行此操作的最佳方法是什么?


动机:
我正在做时间相关的有限元模拟。有时我忘记或错误估计了一个合理的 tmax 并且模拟需要很长时间才能完成,所以我用 ctrl-c 中断它。但是我仍然想使用到那时为止生成的数据。特别是有一个 xml 文件需要在模拟完成后附加几行以关闭标签。当然可以手动执行此操作,但这很痛苦,所以我尝试将其自动化。

最佳答案

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

这是一个工作示例:

#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;
}

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

关于c++ - 在 C++ 中,当被 ctrl-c 中断时,在死亡之前调用带有参数(信号编号除外)的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19366503/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com