有兩種基本類型的UNIX/Linux的管道:命名管道和匿名的。
通過「pipe()」系統調用創建一個匿名管道,該管道返回與新創建的管道關聯的兩個文件描述符,一個用於寫入數據,另一個用於讀取數據。當使用「|」連接兩個進程時,shell使用匿名管道將一個進程的標準輸出連接到另一個進程的標準輸入。運營商。
命名管道在文件系統中顯示爲文件,並且可以使用正常的「open()」系統調用打開。
在阻塞模式下(默認),從管道讀取的進程將阻塞,直到數據出現在那裏;作者可以將數據以字節流的形式顯示給讀者。
這裏的重要事實是傳輸的數據是一個字節流。數據的發送者和接收者必須就協議達成一致以確定如何解釋字節。一種典型的方法是序列化。考慮一個32位整數... 4個字節。有些系統在第一個字節(稱爲big-endian)中存儲這些字節的最高有效位,一些存儲第一個字節(小端系統,如x86)中的最低有效位。當通過網絡傳輸這些數據時,這些數據的序列化非常重要,因爲每一端都可能以不同的順序存儲數據。
但即使在同一主機上的兩個進程之間傳輸數據,序列化也會有所幫助。它可以用來封裝對象,以便接收者知道它什麼時候收到了所有東西。例如,對於我們的32位整數,如果接收者不知道它期望一個整數,並獲得3個字節(第4個已被某個調度延遲),它必須知道它在繼續之前需要等待。
這些都不是特定的特定語言,除了某些語言已經構建支持序列化。 Java就是這樣一種語言(請參閱ObjectInputStream和ObjectOutputStream)。如果您試圖在Java和C程序之間移動數據,並且在Java方面想要使用這些類,那麼您需要了解它們所使用的序列化協議。
另一種常見的序列化技術是JSON(JavaScript Object Notation),在C和Java中存在多個好的庫。
你在這裏比較蘋果和橘子。序列化是一種編碼和解碼數據的方式。管道和插座是移動它的方法。它們不具可比性或競爭性。 – EJP 2014-09-30 23:12:52
謝謝EJP,我很困惑這些術語 – xtiger 2014-10-01 07:06:08