在運行一個線程程序並使用Ctrl + C
反覆查殺主程序時,我在第二次運行中看到了意外的結果。但是,如果我讓程序運行並自願退出,則沒有問題。Ctrl + C:它是否與主進程一起殺死線程?
那麼,我的疑問是,是否Ctrl + C
,殺死線程還有主進程?
在此先感謝。
在運行一個線程程序並使用Ctrl + C
反覆查殺主程序時,我在第二次運行中看到了意外的結果。但是,如果我讓程序運行並自願退出,則沒有問題。Ctrl + C:它是否與主進程一起殺死線程?
那麼,我的疑問是,是否Ctrl + C
,殺死線程還有主進程?
在此先感謝。
那麼,Ctrl + C
所做的唯一的事情就是發送SIGINT
到一個線程在過程中沒有屏蔽信號。信號可以被處理或忽略。
如果程序的確如此句柄Ctrl+C
,通常的行爲是自行終止,但是再一次,它可以用於其他任何事情。
在你的情況下,SIGINT
正在收到一個線程,它可能會自殺,但不會殺死其他人。
在多線程編程中,信號被傳遞到單個線程(通常在沒有阻塞特定信號的線程之間進行不可預測的選擇)。但是,並不意味着,其默認操作是終止一個線程的信號。其實,沒有辦法殺死單個線程而不殺整個進程。
只要你離開SIGINT
以其終止進程的默認動作,只要至少有一個線程離開SIGINT
解鎖,就會這樣做。只要至少有一個線程解鎖就可以了,因此創建應用程序後面線程的庫代碼在調用pthread_create
之前應始終阻止所有信號,然後在調用線程中恢復信號掩碼。
感謝「R」這是有用的。 – kingsmasher1 2011-04-30 14:34:56
在Linux 2.6下使用NPTL線程:我假設進程使用默認信號處理程序,或者調用exit():是的。 C庫exit()調用映射到exit_group系統調用,立即退出所有線程;默認的信號處理程序調用這個或類似的東西。
在Linux 2.4下使用Linuxthreads(或使用2.6,如果你的應用仍然使用Linuxthreads出於某種奇怪的原因):不一定。
Linuxthreads庫使用clone()實現線程,創建一個恰好與父級共享其地址空間的新進程。當父母死亡時,這不一定會死。爲了解決這個問題,pthreads創建了一個「主線程」。這個主線程做了各種各樣的事情,其中之一是嘗試確保當進程退出時(無論出於何種原因)所有線程都被終止。
所以,如果你使用Linuxthreads,可能不是。
其他線程可能不會立即退出,或者根本不退出。
然而,無論你用的,派生的子進程將繼續什麼的線程庫(如果他們仍然是相同的過程組中,他們可能會收到信號,但可以自由地忽略它)
感謝您的回答,它是有用的信息。 – kingsmasher1 2011-04-30 14:35:52
@Heandel:任何關鍵你知道殺死進程+線程的組合嗎? – kingsmasher1 2011-04-29 07:48:51
@Heandel:我知道,事實上我認爲所有Linux用戶:)我有興趣知道關鍵組合。 – kingsmasher1 2011-04-29 07:54:01
@Hanandel:謝謝,你有沒有相應的網頁鏈接?如果是的話,它不僅對我而且對所有用戶都非常有用。 – kingsmasher1 2011-04-29 08:03:00