2011-09-07 105 views
2

我不想使用fork(),因爲它增加了一層我希望避免的IPC管理。我想用pthread。我已經看到了克隆的strace,並且我不想開始以clone()級別的細節管理線程。當父母退出時,希望線程不會死亡 - linux

給他們的名字:A =主線程,B =工作線程。

我希望B在A離開時能夠從A獲得信號。 A可以爲此註冊一個atexit()。

A可能會從abort()或者甚至SIGSEGV或其他終端信號中消失。 B的工作就是記錄日誌:A和B共享一個容器,日誌信息由A創建。如果A死了,我想讓B完成記錄,然後退出。

現在,如果A退出,B退出,並且丟失了日誌隊列中剩下的任何內容。

所以我的問題是這樣的:有沒有辦法使B更有彈性,所以它堅持周圍,不死與A?

+0

pthread_join是你正在尋找,如果我理解正確。父母應該執行pthread_join(CHILD_PID) – galchen

+0

@galchen:一個'pthread_join()'調用如何讓你等待子進程*? –

+0

「pthread_join()函數暫停調用線程的執行,直到目標線程終止,除非目標線程已終止。」 – galchen

回答

3

您似乎很困惑線程進程;你描述它的方式,A是一個過程,而不是一個線程。當調用abort()或遇到SIGSEGV,且A退出時,B - 包含在進程A中的線程 - 也消失。這是沒有辦法的,因爲B與A有着千絲萬縷的聯繫。如果你想要一個進程超越A,那麼你必須使用fork並創建一個新進程。

現在,你可以在一個進程中完全擁有多個線程,而線程B可以超越創建它的線程A-prime - 但是它們都從屬於包含它們的進程,並且不能超越它。

+0

謝謝你提醒我的記憶。這聽起來好像解決方案是讓我的「A」過程成爲線索A-prime。我們有一個過程A,它加入了B和A-prime線程,而沒有其他。如果A-prime SIGSEGV's,A-prime的註冊信號處理程序可以發信號B; B可以完成伐木,A-prime會像它應該放棄的那樣; B-prime退出。進程A加入了兩個線程,現在它也終止了。這會將處理程序吹到線程中。 –

2

您可以爲atexit和您期望的信號(在A中)安裝一個處理程序,它將最後一個「我在這裏完成」消息推入日誌隊列,然後在退出之前加入(等待)B整個過程。

+0

然而,這不適用於SIGKILL,因爲這個過程不能被捕獲 –

+0

@king_nak:沒錯。但是採用雙進程解決方案時,發送給記錄器的SIGKILL將具有相同的效果。 –

2

我想你想創建線程使用pthread_attribute分離。

https://computing.llnl.gov/tutorials/pthreads/

將向您展示如何 - 只是向下搜索的「分離」 :)這將父後生存下來,你可以做你想做的與它之後。

相關問題