【发布时间】:2019-08-15 18:06:34
【问题描述】:
我有一个对象,我想保证即使程序被 Ctrl+C 终止,它也会被破坏。
我曾尝试使用重置唯一指针的信号处理程序来执行此操作,但我被告知 std::unique_ptr::reset 禁止在信号处理程序中使用。
std::unique_ptr<MotionControl> mc;
void signal_handler(int signal_num) {
// destruct MotionControl object and delete pointer
mc.reset();
// terminate program
exit(signal_num);
}
int main(int argc, char** argv)
{
signal(SIGINT, signal_handler);
try {
std::string deviceName("/dev/ttyACM0");
mc = std::unique_ptr<MotionControl>(new MotionControl(deviceName, 119, 65, 10));
...
}
...
}
因此,我该怎么做呢?
编辑 1:我的操作系统是 Ubuntu。
编辑2:调用析构函数失败会导致下次程序运行时硬件损坏。当调用析构函数时,我需要将一些运动控制阶段移动到安全位置。
【问题讨论】:
-
Portable C++ 对信号一无所知。这是一个操作系统的东西。探索
sigset_t和朋友。 -
多理解一下问题就好了:运行的是什么代码?一个可以轮询标志的循环?不同的结构?此外,
~MotionControl()实际执行了什么?如果您的代码由于更严重的原因(例如 SIGKILL 或 SIGSEGV)而失败,那么调用析构函数失败是否会导致硬件损坏或物理风险? -
在信号处理程序中您可以合法地做的事情真的很少。析构函数实际上在做什么?
-
@RAR 如果生命或财产取决于您的清理工作,您可能需要考虑一个脱离上下文的解决方案,例如看门狗进程,以监控关键进程的任何意外终止或冻结。跨度>
-
如果电源反弹不会损坏您的硬件,您可能会决定您的启动顺序应该首先“安全关闭硬件(以避免硬件损坏)”。这可能只是行为的短暂中断。如果您的要求允许的话。