Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在非阻塞发送文件完成时收到通知_C_Linux_Network Programming - Fatal编程技术网

C 如何在非阻塞发送文件完成时收到通知

C 如何在非阻塞发送文件完成时收到通知,c,linux,network-programming,C,Linux,Network Programming,我在Linux上以非阻塞模式使用sendfile来使用零拷贝。 但是,我不知道如何处理以下情况 sendfile(所有数据都缓冲在要发送的内核中) 在发送所有数据包之前,已修改基础文件 客户端现在将接收修改数据,而不是原始数据 你们可以在这里看到一个例子 我的问题是,是否有一种方法可以在所有数据包都已发送时通知我,而不仅仅是在套接字可以再次写入时通知我 我已尝试轮询SIOCOUTQ以检查它是否为零,但仍然存在相同的问题。“在发送所有数据包之前,基础文件已被修改。”-不要让这种情况发生。找出

我在Linux上以非阻塞模式使用sendfile来使用零拷贝。 但是,我不知道如何处理以下情况

  • sendfile(所有数据都缓冲在要发送的内核中)
  • 在发送所有数据包之前,已修改基础文件
  • 客户端现在将接收修改数据,而不是原始数据
你们可以在这里看到一个例子

我的问题是,是否有一种方法可以在所有数据包都已发送时通知我,而不仅仅是在套接字可以再次写入时通知我


我已尝试轮询SIOCOUTQ以检查它是否为零,但仍然存在相同的问题。

“在发送所有数据包之前,基础文件已被修改。”-不要让这种情况发生。找出发生这种情况的原因并停止它。套接字是非阻塞的这一事实是否相关?我认为sendfile会在所有输入都可用时返回,而不管套接字是否阻塞,我遇到的问题不是文件正在被修改。问题是我无法确定何时发送所有数据包,以便允许修改文件。@rici在非阻塞模式下,问题更普遍。@rouzier:在竞争条件下,普遍性越强越好。很少出现的bug更难捕获和修复:)尽管我不明白为什么非阻塞套接字的问题会更普遍——非阻塞不会增加异步性;这只是意味着你将得到伊根不时,并必须重新启动系统调用。但如果你测试过,我会相信你的。是否可以设置
以便_LINGER
并调用
shutdown()
?是否可以向您的通信协议添加明确的确认?