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

时间:2012-07-12 08:21:41

标签: win32-process windows-nt

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

我正在使用createFile函数通过我的服务创建File,如下所示

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时,会发生死锁。

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

谢谢!

1 个答案:

答案 0 :(得分:2)

您的所有进程都在请求独占访问权限,这就是他们无法同时获取文件句柄的原因。您必须在所有进程中同时指定FILE_SHARE_READFILE_SHARE_WRITE,因为它们都在请求读取和写入文件的访问权限。这本身不会导致死锁。所以你必须误用LockFileEx(),但你没有显示该代码。