微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用sendfile,是否有可能知道什么时候in_fd在EOF?

通过阅读Linux系统调用sendfile的手册页 ,我想知道调用程序是否有可能知道什么时候in_fd在EOF。 据推测,这可以通过返回值0来表示,但是这导致了0的返回值实际上意味着什么的问题。 如果sendfile就像write ,那么返回值0就意味着复制了0个字节。 但是,如果sendfile就像read ,那么返回值0意味着EOF。 必须预先知道要从in_fd复制到in_fd多less字节才能使用sendfile ? sendfile返回0时意味着什么?

Linux有零拷贝吗? 拼接或发送文件

Linux套接字:零拷贝本地,TCP / IP远程

什么是vmsplice(2)的语义,有没有赠送?

如何应对3.2亿个272字节的UDP数据包?

使用pipe道将数据发送到多个套接字,tee()和splice()

我不认为有任何直接的方法可以知道,但这不应该是真的。 通常你会通过stat/fstat找到输入文件的大小,并用它来计算你的传输。 套接字结束不会对你有影响。

唯一的情况应该是有问题的,如果你想传输一个正在增长或缩小的文件。 鉴于输入文件必须进行mmap编辑,并且在这种情况下使用mmap可能会发生不好的事情(不需要一些聪明的代码),您可能应该不使用sendfile来处理这些情况。

您可以使用偏移量参数进行读取计数。

根据手册页

如果offset不为NULL,则指向一个变量,该变量包含sendfile()将从其开始从in_fd读取数据的文件偏移量。 当sendfile()返回时,这个变量将被设置为最后一个被读取字节后面的字节偏移量。 如果offset不为NULL,则sendfile()不会修改in_fd的当前文件偏移量; 否则调整当前文件偏移量以反映从in_fd读取的字节数。

count是文件描述符之间复制的字节数。

返回值如果传输成功,则返回写入out_fd的字节数。 出错时,返回-1,并适当地设置errno。

是的,这意味着返回值0意味着没有数据复制到写入套接字。

当发送的字节数为0时,您可以假定EOF已经到达:

sent = sendfile(out_fd,in_fd,&offset,nbytes); if (sent == 0) { // EOF ... }

这个假设也适用于非阻塞套接字的情况。

在我的情况下,通过rsync遇到文件被truncate,app同时使用sendfile传输文件。 我发现应用程序在条件下吃了100%的cpu,我把我的代码修改成参考下面的文章,问题就消失了。 http://www.linuxjournal.com/article/6345

重点是使用F_SETLEASE获取您的应用程序的文件租约。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐