![](/img/trans.png)
[英]C++ What possible ways can a detached thread signal it is terminating?
[英]C++ On what thread signal callback is called?
我需要在终止时退出服务之前运行清理(通过 Linux systemctl stop my-srv
到目前为止,我提出了 2 个解决方案:
void signal_callback(int code)
{
_exit(0);
}
. . .
void main.. {
signal(SIGTERM, signal_callback)
fgetc(stdin); // wait for signal
}
在什么线程上调用signal_callback
? 它会是注册回调的同一个线程吗? 我的意思是如果我在主线程上调用signal
然后在signal_callback
中调用exit
- 应用程序会正常终止吗?
在什么线程上调用 signal_callback?
取决于你如何发送信号。
raise
发送信号,则将在同一线程中调用回调。pthread_kill
发送信号,那么将在其 id 传递给pthread_kill
的线程中调用信号回调。kill
发送信号,那么我认为最好引用文档:
POSIX.1 要求,如果一个进程向自己发送一个信号,并且发送线程没有阻塞该信号,并且没有其他线程在 sigwait(3) 中解除阻塞或等待它,则必须至少有一个解除阻塞的信号在 kill() 返回之前传递给发送线程。
会有差异,如果
如果我...在 signal_callback 中调用 exit - 应用程序会正常终止吗?
不, exit
不是异步安全 function。从信号处理程序调用它是不正确的。
关于编辑: _exit
是异步安全的,因此您可以调用它。 但它不会调用已注册的清理函数,也不会展开堆栈,因此我不会将其描述为“优雅”。
PS main
必须返回int
。
默认情况下,信号被发送到进程; 不适用于该进程可能具有的任何特定线程。 如果有多个线程,则标准未指定哪个线程处理信号。
您当然可以屏蔽信号,以便某些线程不接收它们或只有特定线程处理信号。 参见 Linux 的pthread_sigmask 。
如果我在主线程上调用 signal 然后在 signal_callback 中调用 exit - 应用程序会正常终止吗?
“优雅地”的含义取决于您的程序。 如果您按原样设置信号处理程序,它只会在收到信号后退出。 进程是否干净地死掉取决于它在收到信号时正在做什么,例如是否需要任何清理操作,是否需要释放资源(退出时不会自动释放的资源)等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.