2013-12-12 50 views
1

場景:過程與CreateNamedPipe()創建管,並連接到將其與ConnectNamedPipe(),傳輸一些數據,然後退出(沒有清理)。管道是否存在?它在與CreateFile()不同的過程中打開的另一面是否在創建過程退出時出錯?創建進程退出時,Windows中的命名管道會發生什麼?

更普遍,什麼是命名管道的壽命?應該如何清理陳舊的管道?

回答

5

管道是內核對象,它們生存下去,直到他們所有手柄閉合。

你很可能得到ERROR_BROKEN_PIPE如果客戶不說再見很好地與其他過程保持無論如何使用它。

+2

一個重要的特殊情況:如果管道是一個父進程和子進程之間,和父母無意中允許子進程繼承*雙向*手柄,那麼你就不會得到ERROR_BROKEN_PIPE,你只死鎖。 –

+0

@HarryJohnston:你如何開家長和孩子建立(兩個手柄)之間的管道創建子過嗎?而你如何防止孩子繼承一個而不是另一個?這很有趣,你可以發佈一些示例代碼嗎? –

+1

@AlexI:使用CreatePipe創建匿名管道的兩端,可以選擇使這些控制柄在此處可繼承。使用SetHandleInformation使父端的句柄不可繼承。創建子進程後,關閉原來的子句柄。示例代碼可以在http://msdn.microsoft.com/en-us/library/windows/desktop/ms682499%28v=vs.85%29.aspx找到。 –