在使用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过程中有许多B线程并行运行,每个进程处理数百MB,则进程B有时会遇到MoveFileEx问题。当我运行Process Monitor捕获文件系统活动时,我可以看到,当我们遇到问题时,上述_close(fd)被调用并且没有返回错误,但是Process Monitor不会为该_close(fd)从进程A注册任何CloseFile操作。 )致电。似乎_close(fd)调用未到达操作系统。有没有人遇到过这样的问题?有什么想法可以解决这个问题吗?我尝试使用fopen代替_open和其他类型的冲洗调用,但似乎无济于事。
答案 0 :(得分:2)
值得注意的是,如果您在所有其他标志之外还指定了fopen()
标志,则Microsoft的N
实现也支持文件非继承。本质上,它在内部将_O_NOINHERIT
传递到_open
。
这种情况是有人要在C运行时中使用缓冲的I / O,例如fwrite
,fputs
等(而不是_open
/ write
/ {{1 }}。我花了几个小时进行研究后才添加了此注释,因此我认为将其放在这里也可以作为参考。