c - 延迟写入错误

标签 c networking sysadmin

在过去的几个月里,我们一直在因延迟写入错误而丢失数据。我在自定义代码和收缩包装应用程序中都遇到过错误。例如,下面的错误消息来自 Visual Studio 2008 构建解决方案

Windows - Delayed Write Failed : Windows was unable to save all the data for the file \Vital\Source\Other\OCHSHP\Done07\LHFTInstaller\Release\LHFAI.CAB. The data has been lost. This error may be caused by a failure of your computer hardware or network connection. Please try to save this file elsewhere.

例如,当它出现在 Adob​​e、Visual Studio 或 Word 中时,不会造成任何危害。主要问题是当我们的自定义应用程序(将 dBase 文件中的数据写入网络共享的直接 C 应用程序)出现时。

从程序的角度来看,写入成功。它删除源数据,并继续下一条记录。几分钟后,Windows 弹出一条错误消息,说发生了延迟写入,数据丢失了。

我的问题是,我们可以做些什么来帮助我们的网络/服务器团队隔离并纠正问题(阅读,说服他们问题是真实的。简单地告诉他们很多很多次还没有说服他们)你对我们如何编写以避免数据丢失有什么建议吗?

最佳答案

与任何现代操作系统一样,Windows 上的写入实际上不会发送到磁盘,直到操作系统找到它为止。这是一个巨大的性能胜利,但问题(正如您所发现的)是您无法在写入时检测到错误。

每个执行异步写入的操作系统还提供了将数据强制写入磁盘的机制。在 Windows 上,FlushFileBuffers_commit函数就可以了。 (一个用于 HANDLE,另一个用于文件描述符。)

请注意,您必须检查每个磁盘写入的返回值,这些同步函数的返回值,以确保数据已写入磁盘.另请注意,这些函数会阻塞并等待数据到达磁盘——即使您正在写入网络服务器——因此它们可能会很慢。在您确实需要将数据推送到稳定存储之前不要调用它们。

有关更多信息,请参阅 fsync() Across Platforms .

关于c - 延迟写入错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6777788/

相关文章:

docker - docker域/端口映射到localhost

linux - 删除用户后,我可以查看该用户上次登录的时间吗?

linux - ISP 到 ISP 的快速文件传输?

linux - 在 Ubuntu (14.04) 中,链接器是否有等同于/etc/ld.so.conf.d 的文件?

c - 警告 : implicit declaration of function 'kill'

CPLEX C API 检索变量类型

c - 判断一个数是否为素数的程序

Python - 仅获取连接的本地NIC的MAC地址

linux - 驱动程序是否使用 Linux NAPI 接口(interface)?

c - malloc 时出现段错误