我正在尋找從C編程中讀取stdin
管道數據的最佳方法。如何高效地從stdin管道讀取需要查找的數據
問題:我需要尋求這一數據,也就是我需要在這同一個流的年底讀了一些數據後,從流讀取的開始數據。
小用例:gunzip -c 4GbDataFile.gz | myprogram
還有一句:
- 在本地主機:
nc -l -p 1234 | myprogram
- 遠程主機:
gunzip -c 4GbDataFile.gz | nc -q 0 theotherhost 1234
我知道,從FIFO讀可以做只有一次。所以,此刻:
- 我從
stdin
內存和工作從這塊內存啜一切。
這是醜陋的,但它的工作原理。一個明顯的問題是,如果有人向我的應用發送了一個巨大(或連續)的流,我將以一個大的分配內存塊結束,否則我將耗盡內存。 (想想一個8GB的文件)
我想未來:
- 我設置內存塊的大小限制(也許用戶自定義)。一旦我從標準輸入讀取了這麼多數據:
- 要麼我在這裏停止:「Errr。內存不足,bazinga。忘記它。」風格。
- 要麼我開始傾銷我正在閱讀到文件,並且在讀取所有數據後從該文件開始工作。
但是,那麼,有什麼意義呢?我無法找到我正在閱讀的數據的來源。如果這是一個本地8Gb文件,我將把它轉儲到同一系統上的另一個8Gb文件。
所以,我的問題是:
你如何有效地讀取從當你尋求來回的
stdin
管很多數據?
在此先感謝您的答案。
編輯:
我的程序需要給定的文件中讀取某個地方的元數據(根據文件格式的),所以,也許在流的末尾。然後它可以在流的開始處讀回其他數據,然後在另一個地方讀取其他數據。簡而言之:它需要訪問數據的任何字節。
一個例子是,但不啓動從stdin
讀取之前知道文件格式讀取的歸檔文件的數據:我需要檢查檔案元數據,發現檔案文件名字和偏移等
所以我將製作標準輸入內容的本地副本並從中進行工作。謝謝大家的輸入;)
ITYM'myprogram <4GbDataFile'。目前,'cat 4GbDataFile> myprogram'會覆蓋你的程序二進制文件。當你用管道替換'>'時,你會無用地使用貓。 – Jens
謝謝,修正了錯字,增加了更有用的貓的用法。 – Lenain