2013-02-10 55 views
2

我有一個應用程序在父進程中將數據(控制數據,訪問信息等)寫入管道的一端。在子進程中,我想按照原樣讀取這些數據。使用讀取系統調用讀取緩衝區中的可變大小的數據在C

父進程在許多位置執行許多write()操作。爲了將數據讀入緩衝區,我們需要指定數據的長度

read(int fd, buffer, len). 

我的問題是,父進程每次寫入可變大小的數據。那麼,兒童流程如何才能知道數據的長度。

我試圖讀取單個字符,並把它添加到作爲愛好者,

char ch; 
int n = 0; 
while(n >= 0) 
{ 
    n = read(int fd, ch, 1); 
    *buff = ch; buff++; 
} 

但它似乎並不辦法做到這一點

請告訴我如何讀兒童可變大小數據處理?

回答

3

兩種最常見和最簡單的方法是首先以固定大小寫長度,或者使用特殊的記錄終止符來告訴記錄已經結束。

3

呵呵,你已經問過一個最老的問題了。答案很多已經發展了很多年......組織成線,然後在一次讀取一行並解析儘可能多的數據

  • 寫格式化數據是有
  • 寫的二進制數據,但寫一個記錄類型第一個
  • 如上所述,但在兩個級別中,使用二進制數據,包裝在具有類型字段的記錄中,以及所有前面有記錄長度字的二進制數據。這允許您在層中構建讀取器,較低的I/O層可以輕鬆讀取記錄並將其長度返回到負責應用程序特定邏輯的較高層。
  • 以行格式寫入格式化的數據,但是標識具有領先標識符的「記錄類型」
  • 創建語言併爲其編寫解析器;解析器可能讀取輸入的文本逐字節
  • 組織數據XML
  • 組織的數據作爲YAML
  • 組織數據JSON

所有這些技術有一件事共同點是:讀者必須已經知道編碼類型,並且必須使用程序邏輯準備根據其結構有條件地讀取數據。當然,已經編寫的庫可以讀取XML,YAML和JSON。

4

您需要將格式化的數據放在管道中,可以在讀取端進行解碼。也就是說,您必須指定一種格式/協議才能理解即將推出的數據。您可以指定長度,或者使用以\n\0字符結尾的行,無論是否包含數據。