2010-09-12 96 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获取您的应用程序的文件租约。

相关问题