2010-09-12 39 views
4

通過man page of the Linux system call sendfile的閱讀,我想知道是否有可能讓調用程序知道in_fd何時在EOF。據推測,這可以用返回值0來表示,但是這導致了0的返回值實際上意味着什麼的問題。如果sendfilewrite相似,則返回值0意味着0字節被複制。但是,如果sendfileread類似,則返回值0意味着EOF。必須預先知道要從in_fd複製到out_fd以便使用sendfile多少個字節? sendfile返回0是什麼意思?使用sendfile(),是否有可能知道in_fd何時處於EOF?

回答

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 
    ... 
} 

這種假設也適用於非阻塞套接字的情況。

+1

你從哪裏讀到的? – 2012-08-28 12:32:38

0

在我的情況下,遇到文件被rsync截斷,app同時使用sendfile傳輸文件。我發現應用程序在條件下吃了cpu 100%,我修復我的代碼參考後面的文章,問題消失。 http://www.linuxjournal.com/article/6345

重點是使用F_SETLEASE獲取您的應用程序的文件租約。

相關問題