通過man page of the Linux system call sendfile
的閱讀,我想知道是否有可能讓調用程序知道in_fd
何時在EOF。據推測,這可以用返回值0來表示,但是這導致了0的返回值實際上意味着什麼的問題。如果sendfile
與write
相似,則返回值0意味着0字節被複制。但是,如果sendfile
與read
類似,則返回值0意味着EOF。必須預先知道要從in_fd
複製到out_fd
以便使用sendfile
多少個字節? sendfile
返回0是什麼意思?使用sendfile(),是否有可能知道in_fd何時處於EOF?
4
A
回答
4
我不認爲有任何直接的方式知道,但它應該無關緊要。通常你會通過stat/fstat
找到輸入文件的大小,並用它來計算你的傳輸。套接字結束對你不起作用。
這應該是有問題的唯一情況是如果您想傳輸正在增長或收縮的文件。鑑於輸入文件必須進行mmap編輯,並且在這些情況下可能會發生不好的事情(沒有一些聰明的代碼),所以你可能不應該使用sendfile來處理這些情況。
3
您可以使用偏移參數進行讀取計數。
根據手冊頁
如果偏移不爲空,那麼它指向一個變量保存該文件從偏移了sendfile()將開始in_fd讀取數據。當sendfile()返回時,該變量將被設置爲最後一個讀取字節後面的字節偏移量。如果offset不爲NULL,則sendfile()不會修改in_fd的當前文件偏移量;否則調整當前文件偏移量以反映從in_fd讀取的字節數。
count是要在文件描述符之間複製的字節數。
返回值 如果傳輸成功,則返回寫入out_fd的字節數。出錯時,返回-1,並且適當地設置errno。
是的,這意味着返回值0意味着沒有數據複製到寫入套接字。
0
你可以假設在隨後發送的字節數爲0 EOF已經達到:
sent = sendfile(out_fd, in_fd, &offset, nbytes);
if (sent == 0) {
// EOF
...
}
這種假設也適用於非阻塞套接字的情況。
0
在我的情況下,遇到文件被rsync截斷,app同時使用sendfile傳輸文件。我發現應用程序在條件下吃了cpu 100%,我修復我的代碼參考後面的文章,問題消失。 http://www.linuxjournal.com/article/6345
重點是使用F_SETLEASE獲取您的應用程序的文件租約。
相關問題
- 1. C#WebClient.OpenRead如何知道eof是否?
- 2. 是否有可能知道從哪個
- 3. 是否有可能知道[UIDynamicItemBehavior addLinearVelocity:forItem:]何時已完成運行?
- 4. 是否有可能知道對象屬性何時更改?
- 5. 是否有可能知道,該請求正在處理中
- 6. 是否有可能知道JFrame是否完全可見?
- 7. 是否有可能知道SIM卡狀態 - 對於iPhone編程
- 8. 我想知道是否有可能使用Node.js的
- 9. 更改訂閱時,如何知道CC是否處於分段?
- 10. 是否有可能知道活動是如何開始的?
- 11. 是否有可能知道iPhone中的最後通話時間?
- 12. 是否有可能知道碰撞的確切時間?
- 13. 是否有可能知道我的訪客是否登錄Facebook?
- 14. 是否有可能知道BufferedReader.readLine()是否會提前返回null?
- 15. Mongoose.js:是否有可能知道字段是否已填充
- 16. 是否有可能知道serialVersionUID是否自動生成?
- 17. 是否有可能知道DOM/JavaScript圖像是否具有Alpha通道
- 18. 有可能知道何時建立HttpURLConnection?
- 19. 是否有可能知道在登錄SSH帳戶時使用哪個密鑰
- 20. 沒有EOF的管道數據?可能?
- 21. 是否有可能知道信用卡交易何時到達銀行賬戶?
- 22. 是否有可能知道用戶何時點擊YouTube視頻上的廣告?
- 23. 是否有可能知道何時在Ruby或Ruby on Rails中調用模型?
- 24. 我如何知道用戶是否處於Exposé模式?
- 25. 如何知道用戶是否處於漫遊狀態
- 26. Android如何知道用戶是否處於不活動狀態
- 27. 如何知道url是否可用?
- 28. 如何知道fastcgi_finish_request()是否可用?
- 29. 我怎麼可能知道SQLcommand是否妥善處理?
- 30. 是否有可能知道源應用程序的請求?
你從哪裏讀到的? – 2012-08-28 12:32:38