gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:05:19 26 4
gpt4 key购买 nike

我们在使用 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 )。我在研究了几个小时后添加了这个注释,所以我认为它可能值得在这里也供某人引用。

关于c - Windows C 运行时 _close(fd) 不关闭文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53957563/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com