2011-04-29 43 views

回答

2

那麼,Ctrl + C所做的唯一的事情就是發送SIGINT一個線程在過程中沒有屏蔽信號。信號可以被處理或忽略。

如果程序的確如此句柄Ctrl+C,通常的行爲是自行終止,但是再一次,它可以用於其他任何事情。

在你的情況下,SIGINT正在收到一個線程,它可能會自殺,但不會殺死其他人。

+0

@Heandel:任何關鍵你知道殺死進程+線程的組合嗎? – kingsmasher1 2011-04-29 07:48:51

+0

@Heandel:我知道,事實上我認爲所有Linux用戶:)我有興趣知道關鍵組合。 – kingsmasher1 2011-04-29 07:54:01

+0

@Hanandel:謝謝,你有沒有相應的網頁鏈接?如果是的話,它不僅對我而且對所有用戶都非常有用。 – kingsmasher1 2011-04-29 08:03:00

3

在多線程編程中,信號被傳遞到單個線程(通常在沒有阻塞特定信號的線程之間進行不可預測的選擇)。但是,並不意味着,其默認操作是終止一個線程的信號。其實,沒有辦法殺死單個線程而不殺整個進程。

只要你離開SIGINT以其終止進程的默認動作,只要至少有一個線程離開SIGINT解鎖,就會這樣做。只要至少有一個線程解鎖就可以了,因此創建應用程序後面線程的庫代碼在調用pthread_create之前應始終阻止所有信號,然後在調用線程中恢復信號掩碼。

+0

感謝「R」這是有用的。 – kingsmasher1 2011-04-30 14:34:56

1

在Linux 2.6下使用NPTL線程:我假設進程使用默認信號處理程序,或者調用exit():是的。 C庫exit()調用映射到exit_group系統調用,立即退出所有線程;默認的信號處理程序調用這個或類似的東西。

在Linux 2.4下使用Linuxthreads(或使用2.6,如果你的應用仍然使用Linuxthreads出於某種奇怪的原因):不一定。

Linuxthreads庫使用clone()實現線程,創建一個恰好與父級共享其地址空間的新進程。當父母死亡時,這不一定會死。爲了解決這個問題,pthreads創建了一個「主線程」。這個主線程做了各種各樣的事情,其中​​之一是嘗試確保當進程退出時(無論出於何種原因)所有線程都被終止。

  1. 它不一定成功
  2. 如果它成功,它不一定是直接的,特別是如果有大量的線程。

所以,如果你使用Linuxthreads,可能不是。

其他線程可能不會立即退出,或者根本不退出。

然而,無論你用的,派生的子進程將繼續什麼的線程庫(如果他們仍然是相同的過程組中,他們可能會收到信號,但可以自由地忽略它)

+0

感謝您的回答,它是有用的信息。 – kingsmasher1 2011-04-30 14:35:52