通过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. 是否有可能知道JFrame是否完全可见?
- 3. 是否有可能知道SIM卡状态 - 对于iPhone编程
- 4. 更改订阅时,如何知道CC是否处于分段?
- 5. 是否有可能知道活动是如何开始的?
- 6. 是否有可能知道iPhone中的最后通话时间?
- 7. 是否有可能知道我的访客是否登录Facebook?
- 8. 是否有可能知道serialVersionUID是否自动生成?
- 9. 有可能知道何时建立HttpURLConnection?
- 10. 没有EOF的管道数据?可能?
- 11. 是否有可能知道信用卡交易何时到达银行账户?
- 12. 我如何知道用户是否处于Exposé模式?
- 13. Android如何知道用户是否处于不活动状态
- 14. 如何知道url是否可用?
- 15. 如何知道fastcgi_finish_request()是否可用?
- 16. 是否有可能知道源应用程序的请求?
- 17. 如何知道在使用Parse.com时是否有Internet Android
- 18. 是否有可能知道哪些文件是由火狐硒
- 19. 是否有可能知道,如果该参数是默认的
- 20. 是否有可能知道该函数是否在PHP中的eval()中调用?
- 21. 是否有可能知道.NET Framework是否从.NET应用程序安装?
- 22. 是否有可能知道WP7应用程序是否被固定?
- 23. 是否有可能使用three.js轨道控制轨道?
- 24. Eclipse如何知道Swing Designer是否可用于JFrame派生类?
- 25. 是否有可能知道节点何时添加到树视图?
- 26. 是否有可能知道关联对象何时即将销毁?
- 27. 如何知道列表视图是否处于活动状态?
- 28. 如何知道线程是否处于死锁状态?
- 29. 如何知道MediaRecorder是否处于运行状态?
- 30. 如何知道手机是否处于锁定状态
你从哪里读到的? – 2012-08-28 12:32:38