簡體   English   中英

了解讀取的系統調用

[英]Understanding read syscall

我正在閱讀手冊頁的man read ,發現可以讀取的字數少於所需的作為參數傳遞的字節數:

如果此數目小於請求的字節數,這不是錯誤; 例如,這可能是因為當前實際可用的字節較少(可能是因為我們接近文件末尾,或者因為我們正在從管道或終端讀取),或者因為read()被中斷了通過信號。

我有以下情況:

  1. 某些進程將文件移到了我正在監聽IN_MOVED_TO inotify事件的目錄中。
  2. 我收到一個IN_MOVED_TO事件,打開一個文件並開始讀取它,直到到達EOF
  3. 沒有其他進程修改移動過的1.文件(移動后,它始終保持不變)。

是否可以保證如果read返回的字節數少於我請求的字節數,則下一個read調用將返回0? 我的意思是該文檔禁止類似“以千兆字節文件的單個字節讀取1000000000000”的情況

是否可以保證如果read返回的字節數少於我請求的字節數,則下一個read調用將返回0?

不,實際上沒有。 如果文件系統完全符合POSIX,但其中許多不兼容(在極端情況下),則應為true。 特別是NFS(請參閱nfs(5) )和FUSE或proc(請參閱proc(5) )並不完全符合POSIX。

因此,在實踐中,我強烈建議您處理“ read返回的字節數少於所需大小寫的字節數”,即使您有理由相信它不會發生也是如此。 處理“不可能”的情況對您來說應該很容易。

還要注意, inotify(7)工具不能與NFS,proc,FUSE等離奇的文件系統一起使用。...還可以考慮在Ext4文件系統內部,與NFS文件建立符號鏈接等極端情況; 或綁定坐騎等

暫無
暫無

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

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