C 如何在非阻塞发送文件完成时收到通知
我在Linux上以非阻塞模式使用sendfile来使用零拷贝。 但是,我不知道如何处理以下情况C 如何在非阻塞发送文件完成时收到通知,c,linux,network-programming,C,Linux,Network Programming,我在Linux上以非阻塞模式使用sendfile来使用零拷贝。 但是,我不知道如何处理以下情况 sendfile(所有数据都缓冲在要发送的内核中) 在发送所有数据包之前,已修改基础文件 客户端现在将接收修改数据,而不是原始数据 你们可以在这里看到一个例子 我的问题是,是否有一种方法可以在所有数据包都已发送时通知我,而不仅仅是在套接字可以再次写入时通知我 我已尝试轮询SIOCOUTQ以检查它是否为零,但仍然存在相同的问题。“在发送所有数据包之前,基础文件已被修改。”-不要让这种情况发生。找出
- sendfile(所有数据都缓冲在要发送的内核中)
- 在发送所有数据包之前,已修改基础文件
- 客户端现在将接收修改数据,而不是原始数据
我已尝试轮询SIOCOUTQ以检查它是否为零,但仍然存在相同的问题。“在发送所有数据包之前,基础文件已被修改。”-不要让这种情况发生。找出发生这种情况的原因并停止它。套接字是非阻塞的这一事实是否相关?我认为sendfile会在所有输入都可用时返回,而不管套接字是否阻塞,我遇到的问题不是文件正在被修改。问题是我无法确定何时发送所有数据包,以便允许修改文件。@rici在非阻塞模式下,问题更普遍。@rouzier:在竞争条件下,普遍性越强越好。很少出现的bug更难捕获和修复:)尽管我不明白为什么非阻塞套接字的问题会更普遍——非阻塞不会增加异步性;这只是意味着你将得到伊根不时,并必须重新启动系统调用。但如果你测试过,我会相信你的。是否可以设置
以便_LINGER
并调用shutdown()
?是否可以向您的通信协议添加明确的确认?