[英]What signals shouldn't be blocked by thread in multi-threaded program in C?
我有一個多線程程序。 我想在一個線程中處理所有有意義的信號。 這就是我在創建任何線程之前所做的事情:
sigset_t signal_set, old_set;
sigfillset(&signal_set);
// What signals should I leave unblocked here?
pthread_sigmask(SIG_SETMASK, &signal_set, &old_set);
std::thread( /* some args */ );
pthread_sigmask(SIG_SETMASK, &old_set, nullptr);
但我的理智建議保留一些信號暢通無阻,因為有很多情況可以將信號直接發送到特定線程: SIGSEGV
或SIGPROF
- 我相信,它與在交互式程序中保留未阻塞的SIGINT
一樣好。
我的建議是否正確這兩個信號( SIGSEGV
, SIGPROF
)?
根據一些常識,我應該保留哪些其他信號?
異步信號(其中大部分信號,包括由kill
命令/函數發送的任何信號以及控制終端產生的信號,如SIGINT
)都可以傳送到信號未被阻塞的進程中的任何線程,因此不需要保持它們暢通無阻。所有線程。 如果您正在使用專用信號處理線程,則希望它們在除信號處理線程之外的所有線程中都被阻止。
另一方面,同步信號由於該線程的動作而被傳遞到特定線程。 它們包括SIGPIPE
, SIGBUS
, SIGSEGV
, SIGFPE
等。除了SIGPIPE
,除非您的程序中存在嚴重錯誤,否則這些都不會發生,並且您可能想要阻止SIGPIPE
,以便您可以反而獲得EPIPE
錯誤並處理這個條件得當。 因此,在大多數情況下,我會說只是阻止它們並沒有什么壞處。 如果你真的發現自己需要處理SIGSEGV
等,你可能應該重新考慮原因,但同時可以隨意取消阻止它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.