2011-10-26 71 views
2

大師,我有2個問題與Linux功能:一個進程的信號如何影響其子線程?

  1. 睡眠

    據我所知,在睡眠過程中會得到打斷任何信號發送的過程。這是正確的嗎?

  2. 還是睡眠

    如果我創建的過程中幾個線程,我在線程插入睡眠功能,並且,然後如果我發送信號到進程,將睡眠被中斷?

順便說一句如果我發送信號給進程,當進程得到信號,它會發送到它的子線程嗎?

thanx您的答案

回答

1

1:是的沒錯。如果您在sleep()之後檢查errno,它將被設置爲EINTR(中斷)。

2:每個線程都可以使用pthread_sigmask()來設置它自己的信號掩碼,如果它阻塞信號,它將不會被髮送。然而,如果它們沒有明確地阻止信號,它就沒有定義哪個線程接收到信號。

但是,您可以使用pthread_kill()直接向特定線程發送信號。

0

流程指導的信號被傳送到進程的線程的一個一個。如果該線程正在睡眠,它將被喚醒。

3

1:睡眠, 正如我所知睡眠過程中將被任何發送信號的過程中斷。 是不是?

它會被打斷,除非使用sigprocmask忽略或阻止特定信號。

2:還是睡眠,如果 我在這個過程中創建多個線程,和我在線程插入睡眠功能 ,然後如果我發送信號到進程,將睡眠 被打斷?

即使該進程中有多個線程將該信號解鎖,只有一個線程接收發送到該進程的信號。有關更多詳情,請參閱Signal Concepts。在多線程過程中處理信號的標準方法是在所有線程中阻塞所有信號,但處理信號的線程(通常是主線程)。

順便說一句:如果我發送信號給進程,當進程得到信號時,它會發送到它的子線程嗎?

它不會。

但是,如果進程是控制終端的會話組領導,則當會話首領終止時,其組將會收到SIGHUP信號。另外,當一個進程組成爲孤立時,它的進程將被髮送SIGHUP,然後是SIGCONT

+0

:Maxim,比你的答案,這是非常有用的。你可以給我一些這些機制的參考。 –

+0

我提到的Signal Concept鏈接非常好。您也可以閱讀W. Richard Stevens在UNIX環境下的高級編程中有關信號的章節。 –

+0

明白了。非常感謝 –

相關問題