win32-process - 两个进程读取/写入同一文件 - Win32 使用 LockFileEx() 函数

标签 win32-process windows-nt

我正在编写一个服务,它将创建一个文件并在其中写入记录,其他进程(有四个并发进程)将读取记录并修改其一些值。我目前正在使用LockFileEx()UnLockFileEx()测序功能。

我正在使用 createFile 函数通过我的服务创建文件,如下

FILEHANDLE = ::CreateFile ( TEXT("C:\\abc.BIN"),
                            GENERIC_READ | GENERIC_WRITE,
                            0,
                            NULL,
                            OPEN_ALWAYS ,
                            FILE_ATTRIBUTE_NORMAL,
                            NULL );

和其他进程获取文件句柄,如下所示:

FILEHANDLE = ::CreateFile(TEXT("C:\\abc.BIN"),
                          GENERIC_READ |  GENERIC_WRITE,
                          0,
                          NULL,
                          OPEN_EXISTING,
                          FILE_ATTRIBUTE_NORMAL,
                          NULL);

问题是两个或多个进程无法同时获取文件句柄。当一个进程正在写入文件时,其他进程甚至无法获取仅用于读取的文件句柄,即使我正在使用 LockFileEx()锁定文件的指定区域而不是整个文件的函数。每次当我尝试通过设置 FILE_SHARED_READ 打开文件时,我都会收到系统错误代码 32标志或当我尝试以独占方式打开它时。当我设置 FILE_SHARE_READ | FILE_SHARE_WRITE ,发生死锁。

请告诉我任何解决方案,以便我可以通过多个进程打开文件。

谢谢!!

最佳答案

您的所有进程都在请求独占访问,这就是它们无法同时获取文件句柄的原因。您必须在所有进程中同时指定 FILE_SHARE_READFILE_SHARE_WRITE,因为它们都请求对文件进行读写访问。这本身不会导致僵局。因此,您一定是误用了 LockFileEx(),但您没有显示该代码。

关于win32-process - 两个进程读取/写入同一文件 - Win32 使用 LockFileEx() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11447752/

相关文章:

c# - 如何在不使用 SendMessage 的情况下将 "Message"发送到 .Net 中的另一个进程?

go - Go编译的二进制文件是否可以在Windows NT上运行,包括使用以太网端口?

linux - Linux Darwin 和 Windows_NT 系统中的禁止文件/目录名称

screen - 在现代版本的 Windows 上最小化窗口是否仍将其移动到坐标 (-32000, -32000)?

javascript - 错误 : bcrypt_lib. Node 不是有效的 Win32 应用程序

winapi - 进程崩溃时未释放 Win32 命名互斥锁

collections - 在没有 "For Each"枚举的情况下从 VBScript 访问 WMI 集合对象

winapi - CreateProcessAsUser 与 ShellExecute

windows - 编写 Windows NT 子系统