大師,我有2個問題與Linux功能:一個進程的信號如何影響其子線程?
睡眠
據我所知,在睡眠過程中會得到打斷任何信號發送的過程。這是正確的嗎?
還是睡眠
如果我創建的過程中幾個線程,我在線程插入睡眠功能,並且,然後如果我發送信號到進程,將睡眠被中斷?
順便說一句如果我發送信號給進程,當進程得到信號,它會發送到它的子線程嗎?
thanx您的答案
大師,我有2個問題與Linux功能:一個進程的信號如何影響其子線程?
睡眠
據我所知,在睡眠過程中會得到打斷任何信號發送的過程。這是正確的嗎?
還是睡眠
如果我創建的過程中幾個線程,我在線程插入睡眠功能,並且,然後如果我發送信號到進程,將睡眠被中斷?
順便說一句如果我發送信號給進程,當進程得到信號,它會發送到它的子線程嗎?
thanx您的答案
https://computing.llnl.gov/tutorials/pthreads/#ConVarOverview
你只需要閱讀節 「條件變量」。它可以幫助您爲您的目的獲得pthread的概述。
1:是的沒錯。如果您在sleep()
之後檢查errno
,它將被設置爲EINTR
(中斷)。
2:每個線程都可以使用pthread_sigmask()
來設置它自己的信號掩碼,如果它阻塞信號,它將不會被髮送。然而,如果它們沒有明確地阻止信號,它就沒有定義哪個線程接收到信號。
但是,您可以使用pthread_kill()
直接向特定線程發送信號。
流程指導的信號被傳送到進程的線程的一個一個。如果該線程正在睡眠,它將被喚醒。
1:睡眠, 正如我所知睡眠過程中將被任何發送信號的過程中斷。 是不是?
它會被打斷,除非使用sigprocmask
忽略或阻止特定信號。
2:還是睡眠,如果 我在這個過程中創建多個線程,和我在線程插入睡眠功能 ,然後如果我發送信號到進程,將睡眠 被打斷?
即使該進程中有多個線程將該信號解鎖,只有一個線程接收發送到該進程的信號。有關更多詳情,請參閱Signal Concepts。在多線程過程中處理信號的標準方法是在所有線程中阻塞所有信號,但處理信號的線程(通常是主線程)。
順便說一句:如果我發送信號給進程,當進程得到信號時,它會發送到它的子線程嗎?
它不會。
但是,如果進程是控制終端的會話組領導,則當會話首領終止時,其組將會收到SIGHUP
信號。另外,當一個進程組成爲孤立時,它的進程將被髮送SIGHUP
,然後是SIGCONT
。
:Maxim,比你的答案,這是非常有用的。你可以給我一些這些機制的參考。 –
我提到的Signal Concept鏈接非常好。您也可以閱讀W. Richard Stevens在UNIX環境下的高級編程中有關信號的章節。 –
明白了。非常感謝 –
簡答:它取決於。 –