C++ 在信号处理程序后继续执行
C++ Continue the execution after signal handler
我正在尝试管理C++中的信号,然后继续正常执行程序。我使用信号而不是异常,因为当传感器未连接时,程序会自行阻止(我无法更改(。
引发信号的代码部分使用线程作为计时器。由于线程无法引发异常,因此我决定发出信号(在本例中为 SIGTERM(。
当我尝试以与异常但信号处理程序相同的方式继续程序时,问题就开始了。我利用setjmp库来解决问题:
jmp_buf gBuffer;
void signalHandler(int signal) {
longjmp(gBuffer, 1);
}
int main() {
std::signal(SIGTERM, signalHandler);
if (setjmp(gBuffer) == 0) {
/* ---------------------
Part of code that raise the signal
--------------------- */
}
}
它工作正常,但是当程序完成时,会出现内存错误:
*** stack smashing detected ***: <unknown> terminated
Aborted (core dumped)
在调试模式下执行程序时的回溯为:
Thread 2 "EXECUTABLE_FILE" received signal SIGTERM, Terminated.
[Switching to Thread 0x7ffff01f2700 (LWP 31718)]
raise (sig=<optimized out>) at ../sysdeps/unix/sysv/linux/raise.c:51
51 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0 raise (sig=<optimized out>) at ../sysdeps/unix/sysv/linux/raise.c:51
#1 0x00007ffff78531ab in "THREAD THAT RAISE THE SIGNAL" (futureObj=...)
at "LINE THAT RAISE THE SIGNAL"
#2 0x00007ffff7856ffd in std::__invoke_impl<void, void (*)(std::future<void>), std::future<void> >
(__f=<optimized out>) at /usr/include/c++/7/bits/invoke.h:60
#3 std::__invoke<void (*)(std::future<void>), std::future<void> > (__fn=<optimized out>)
at /usr/include/c++/7/bits/invoke.h:95
#4 std::thread::_Invoker<std::tuple<void (*)(std::future<void>), std::future<void> > >::_M_invoke<0ul, 1ul> (this=<optimized out>) at /usr/include/c++/7/thread:234
#5 std::thread::_Invoker<std::tuple<void (*)(std::future<void>), std::future<void> > >::operator()
(this=<optimized out>) at /usr/include/c++/7/thread:243
#6 std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)(std::future<void>), std::future<void> > > >::_M_run (this=<optimized out>) at /usr/include/c++/7/thread:186
#7 0x00007ffff6e41d80 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#8 0x00007ffff714c6db in start_thread (arg=0x7ffff01f2700) at pthread_create.c:463
#9 0x00007ffff688988f in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
如果有人可以帮助我,我真的很感激。我还可以更改引发信号的代码部分,引发异常,但我不知道如何在线程中执行此操作。
你不能直接按照你设想的方式去做——对不起。是的,你的信号处理程序被调用,但一般来说,由于信号处理程序的限制(例如,新信号可能会被阻止被引发等(,你不能(也不应该尝试(从信号处理程序中继续执行主程序。
因此,你的信号处理程序应该设置某种标志,例如原子布尔值或条件变量或任何你喜欢的方法。然后从信号处理程序返回。然后在"违规代码"附近有一个循环,可以检查它,然后能够返回/展开/终止计时器。
相关文章:
- C++ 在信号处理程序后继续执行
- 超时后,线程睡眠不会继续执行
- 在构造函数中删除后继续执行
- c++:if 语句无法正常运行,并继续执行无效输出
- 英特尔 Pin:RECEIVED_ACCESS_FAULT异常后正确继续执行
- 如果发生错误,则返回错误值,否则,继续执行函数
- 睡眠线程或进程的指令是否在线程/进程休眠时继续执行?
- 使用 UWP 中的 IAsyncOperation 继续执行任务
- 是什么导致程序在我继续执行另一个功能之前停止
- 使用 ASSERT_DEATH 时,有没有办法在应用程序终止后自动继续执行所有测试
- 现代C++.从继续执行的工作线程返回数据结构
- 在击中断点并继续执行VS时,如何在运行时自动修改变量的值
- 在调用GNUPLOT之后,如何继续执行C 代码
- OpenMP 构造,在至少 1 个线程完成后立即继续执行
- 如果我已经完成了当前功能,我该如何选择继续执行另一个功能
- 循环浏览文件夹中的所有文件以继续执行脚本
- 在程序继续执行的同时,如何使代码的两部分之间存在时间间隔或延迟?C++
- C++if-else语句继续执行if,而不是else下的代码
- 继续执行另一个线程
- pthread_join()是否允许在调用线程上继续执行