Windows C运行时_close(fd)不关闭文件

时间:2018-12-28 11:08:32

标签: c windows file-handling

在使用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和其他类型的冲洗调用,但似乎无济于事。

1 个答案:

答案 0 :(得分:2)

值得注意的是,如果您在所有其他标志之外还指定了fopen()标志,则Microsoft的N实现也支持文件非继承。本质上,它在内部将_O_NOINHERIT传递到_open

这种情况是有人要在C运行时中使用缓冲的I / O,例如fwritefputs等(而不是_open / write / {{1 }}。我花了几个小时进行研究后才添加了此注释,因此我认为将其放在这里也可以作为参考。