【发布时间】:2018-05-15 21:17:58
【问题描述】:
作为服务器,我想从非阻塞客户端套接字读取,然后写入文件。
根据 sendfile 的手册页,如果 errno 设置为 EAGAIN,那么这仅表明,如果 output 文件描述符设置为非阻塞,则调用 sendfile 将块。
也就是说,sendfile 对 write 进行的底层调用会阻塞。
如果读取会阻塞,是否仍然可以使用 sendfile 以使 errno 成为 EAGAIN?
【问题讨论】:
作为服务器,我想从非阻塞客户端套接字读取,然后写入文件。
根据 sendfile 的手册页,如果 errno 设置为 EAGAIN,那么这仅表明,如果 output 文件描述符设置为非阻塞,则调用 sendfile 将块。
也就是说,sendfile 对 write 进行的底层调用会阻塞。
如果读取会阻塞,是否仍然可以使用 sendfile 以使 errno 成为 EAGAIN?
【问题讨论】:
当然。
将select() 库函数与您的读取描述符一起使用,您可以通过errno 检查EWOULDBLOCK。如果已设置,则读取将阻塞。
您无法通过检查sendfile() 调用中的某些内容来查看读取是否会阻塞。
【讨论】: