簡體   English   中英

在C中的多線程程序中,線程不應該阻塞哪些信號?

[英]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);

但我的理智建議保留一些信號暢通無阻,因為有很多情況可以將信號直接發送到特定線程: SIGSEGVSIGPROF - 我相信,它與在交互式程序中保留未阻塞的SIGINT一樣好。


我的建議是否正確這兩個信號( SIGSEGVSIGPROF )?

根據一些常識,我應該保留哪些其他信號?

異步信號(其中大部分信號,包括由kill命令/函數發送的任何信號以及控制終端產生的信號,如SIGINT )都可以傳送到信號未被阻塞的進程中的任何線程,因此不需要保持它們暢通無阻。所有線程。 如果您正在使用專用信號處理線程,則希望它們在除信號處理線程之外的所有線程中都被阻止。

另一方面,同步信號由於該線程的動作而被傳遞到特定線程。 它們包括SIGPIPESIGBUSSIGSEGVSIGFPE等。除了SIGPIPE ,除非您的程序中存在嚴重錯誤,否則這些都不會發生,並且您可能想要阻止SIGPIPE ,以便您可以反而獲得EPIPE錯誤並處理這個條件得當。 因此,在大多數情況下,我會說只是阻止它們並沒有什么壞處。 如果你真的發現自己需要處理SIGSEGV等,你可能應該重新考慮原因,但同時可以隨意取消阻止它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM