我有一个带有用户定义析构函数的类。如果该类最初是实例化的,然后在程序运行时发出 SIGINT(在 unix 中使用 CTRL+C),会调用析构函数吗? SIGSTP(unix 中的 CTRL + Z)的行为是什么?
原文由 SkypeMeSM 发布,翻译遵循 CC BY-SA 4.0 许可协议
我有一个带有用户定义析构函数的类。如果该类最初是实例化的,然后在程序运行时发出 SIGINT(在 unix 中使用 CTRL+C),会调用析构函数吗? SIGSTP(unix 中的 CTRL + Z)的行为是什么?
原文由 SkypeMeSM 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答3.3k 阅读
不,默认情况下,大多数信号会导致程序立即异常退出。
但是,您可以轻松更改大多数信号的默认行为。
这段代码展示了如何让信号正常退出程序,包括调用所有常用的析构函数:
如果你运行这个程序并按下 control-C,你应该会看到打印出的单词“destructor”。
请注意,您的信号处理函数(got_signal)应该很少做任何工作,除了设置一个标志并安静地返回,除非您真的知道自己在做什么。另见: https ://man7.org/linux/man-pages/man7/signal-safety.7.html
如上所示,大多数信号都是可捕获的,但不是 SIGKILL,您无法控制它,因为 SIGKILL 是杀死失控进程的最后手段,而不是允许用户冻结进程的 SIGSTOP。请注意,如果需要,您可以捕获 SIGTSTP (control-Z),但如果您对信号的唯一兴趣是析构函数行为,则不需要这样做,因为最终在 control-Z 之后,进程将被唤醒,将继续运行,并且将在所有析构函数生效的情况下正常退出。