【发布时间】:2015-10-22 19:35:11
【问题描述】:
我正在尝试捕捉一个信号,以便让我们的程序优雅地退出。当我们读取一个我们无法控制的坏文件时会发生 SIGABRT。这是一个多平台程序,所以我们需要在 windows、linux 和 mac 中运行的东西。
由于某种原因,当我在 signal handling example 添加一个 signal_callback_handler 并在 Windows 中运行问题测试时,它仍然像以前一样出现中止弹出框。如何在中止弹出窗口发生之前重定向?我希望我们的程序优雅地退出。
//constructor
example::example(const string theString)
{
signal(SIGABRT, signal_callback_handler);
}
void example::signal_callback_handler(int sigNum)
{
//want to handle gracefully here, but it's not getting caught
}
bool example::someMethod()
{
FileHandle.openFile(problemDocument); //this openFile is where the SIGABRT happens
}
谢谢!
【问题讨论】:
-
answer 对您的问题有帮助吗?
-
我看到了那个例子,Antoine Matthys 的例子和我的很相似。我正在查看它下面的示例并添加了评论。我仍然得到中止弹出窗口。我想以自己的方式退出代码。我意识到代码不能按原样继续,但它根本没有达到我在处理程序中添加的断点。
-
你真的可以将类方法传递给
signal吗?我认为这在许多系统上都行不通,因为example::signal_callback_handler()期望通过其不可见的this参数,而系统信号处理代码无法做到这一点。因此,根据调用约定,它可能会得到一组完全混乱的参数。如果你使用不是方法的回调函数会发生什么? -
@Nate:大概它是一个静态成员函数,或者编译器会适合。由于不同的语言链接,根据 C++ 标准 IMO 在技术上是非法的,但实际上它应该可以工作(至少在 Windows 上)。
-
我确实把它变成了静态的。感谢您的信息。
标签: linux windows macos c++11 sigabrt