我们在使用 C 和 C++ 混合编写的 Windows 应用程序进行生产时遇到问题,其中 MoveFileEx 偶尔会报告“该进程无法访问该文件,因为该文件正在被另一个进程使用。”。这个问题很少见,但最近我们已经能够在我们的开发环境中重现该问题。发生的情况是进程 A 通过网络接收数据并使用该数据创建一个文件:
fd = _open(fileName, O_CREAT | O_WRONLY | O_TRUNC | O_BINARY, _S_IREAD | _S_IWRITE);
...
while (data on network) {
write(fd, buffer, count);
}
...
int close_result = _close(fd);
在此之后,进程 A 打开文件进行读取并再次关闭它。然后,进程 A 在不退出的情况下创建进程 B。在非常高的负载下,A 中的许多线程和许多 B 进程并行,每个进程处理数百 MB,进程 B 有时会遇到 MoveFileEx 问题。当我运行 Process Monitor 来捕获文件系统活动时,我可以看到,当我们遇到问题时,会调用上述 _close(fd) 且不会返回任何错误,但 Process Monitor 不会为该 _close(fd) 注册来自进程 A 的任何 CloseFile 操作) 称呼。 _close(fd) 调用似乎未到达操作系统。有人遇到过这样的问题吗?有什么想法可以尝试解决这个问题吗?我尝试过使用 fopen 而不是 _open 和不同类型的刷新调用,但似乎没有任何帮助。
值得注意的是,微软的实施fopen()
如果您指定,还支持文件非继承N
除所有其他标志外的标志。本质上是通过了_O_NOINHERIT
内部到_open
.
这是有人想在 C 运行时使用缓冲 I/O 的情况,例如fwrite
, fputs
等(而不是_open
/write
/_close
)。我在花了几个小时进行研究后添加了此注释,因此我认为也值得将其放在这里供某人参考。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)