繁体   English   中英

C++ 在什么线程信号回调被调用?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM