簡體   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