【发布时间】:2009-12-20 14:49:25
【问题描述】:
在我的程序中,我需要检查非阻塞套接字中的 sendfile() 操作是否完成。怎么办?
查看文档并在互联网上搜索后,我不知道该怎么做
【问题讨论】:
标签: c sockets nonblocking
在我的程序中,我需要检查非阻塞套接字中的 sendfile() 操作是否完成。怎么办?
查看文档并在互联网上搜索后,我不知道该怎么做
【问题讨论】:
标签: c sockets nonblocking
它的工作原理与send() 非常相似:如果套接字设置为O_NONBLOCK 并且操作将阻塞,sendfile() 立即返回并将errno 设置为EAGAIN。在这种情况下,您必须等待一段时间,然后再试一次(可能使用select() 之类的函数来知道它何时准备就绪)。
还请记住,即使成功,它也可能不会在单个函数调用中写入您请求的所有字节。始终检查返回值:
如果传输成功,写入out_fd的字节数为 回来。出错时,返回 -1,并适当设置 errno。
你也可以看看man page for sendfile()
【讨论】:
sendfile() 返回的值 > 0,那么现在已经成功发送了这么多字节 - 无需等待完成。 “非阻塞”并不意味着“异步”。
mmap 和阻塞操作的块或字符设备节点,这将是一个非常不寻常的组合(而且直接来自设备节点的sendfile() 是不寻常的)。不过在这种情况下,我相信sendfile() 会等待输入数据,就像进程已经映射了设备并在映射上发生了小错误一样。
sendfile 在没有一个、一个或两个 FD 为非阻塞时的精确行为。谁的边缘被触发了?