2015-07-12 37 views
1

我有以下問題,我必須共享套接字連接和我正在偵聽不同進程之間的單個服務器套接字。在Linux中共享套接字並從進程死亡中恢復?

我可以通過創建一個良好定義的共享內存區域來對所有進程進行映射,並使用一個定義良好的協議來同步這個區域。

協作進程之間的一個進程接管了這個結構並處理了使用共享內存發送消息的所有進程的實際TCP套接字連接。

爲了避免併發問題和混亂/競爭條件,一個特定的進程有它自己的時隙,它可能用它來交換或接收來自任何這些套接字的消息。

這工作得不錯,但當過程結束,甚至崩潰時,我需要一種方式來交換和使用套接字連接的方式是一致的。

據我瞭解,套接字連接綁定到它創建的進程並將在進程終止時釋放。

是否有任何想法如何避免產生擁有套接字的另一個進程?

+0

Eh?你做產卵。它不是自動的。進程崩潰不會導致系統崩潰。這種情況通常由套接字繼承和fork()來處理。很難看出你爲什麼不使用它。 – EJP

+0

如果整個通信過程崩潰並且無法恢復套接字連接,我寧願使系統崩潰並重啓(哪一個可以),而不是使用與參與者相同的UUID恢復每個連接。我無法想出一個好的可靠恢復策略。 –

+0

我刪除了崩潰重啓過程的想法,因爲它錯過了領先。抱歉。你關於套接字繼承的提示很有趣,並導致找到正確的答案。非常感謝。 –

回答

0

得到有關套接字繼承的提示後,我注意到Linux使用文件描述符處理套接字。使用套接字API(http://linux.die.net/man/7/unix),可以使用sendmsg/recvmsg發送包含權限和文件描述符等數據的輔助消息。

使用支持文件描述符的輔助消息套接字可以在解決我的問題的進程之間共享。因此,如果我讓所有進程共享套接字,但只有一個使用它,另一個可以前進並接管當前套接字「主」。

這樣我仍然可以使用共享內存進行這種類型的通信,比使用進程間套接字通信快多倍。

因此再次感謝EJP爲您的寶貴意見。