簡體   English   中英

使用C中的讀取系統調用讀取緩沖區中可變大小的數據

[英]Reading data of variable size in buffer using read system call in C

我有一個應用程序,它將數據(控制數據,訪問信息等)寫入父進程的管道的一端。 在子進程中,我想要按原樣讀取該數據。

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

read(int fd, buffer, len).

我的問題是,父進程每次都寫入可變大小的數據。 那么子進程將如何知道數據的長度。

我試圖讀取單個字符並將其添加到buff中,

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

但它似乎沒有辦法做到這一點

請告訴我如何讀取子進程中的可變大小數據?

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

嘿,你問了一個最古老的問題。 多年來已經開發出許多答案......

  • 寫入按行組織的格式化數據,然后一次讀取一行並解析那里的數據
  • 寫二進制數據,但先寫一個記錄類型
  • 如上所述,但在兩個級別中,使用二進制數據,包含在具有類型字段的記錄中,以及所有前面都有記錄長度字的數據。 這允許您在層中構建讀取器,較低的I / O層可以輕松讀取記錄並將其長度返回到負責特定於應用程序的邏輯的更高層。
  • 將格式化數據寫入行,但標識帶有前導標識符的“記錄類型”
  • 創建一種語言並為其編寫解析器; 解析器可能會逐字節地將輸入作為文本讀取
  • 將數據組織為XML
  • 將數據組織為YAML
  • 將數據組織為JSON

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM