无法并行读取同一文件
本文关键字:文件 读取 并行 | 更新日期: 2024-10-30 13:03:03
我正在尝试同时读取两个不同应用程序中的日志文件。但是共享模式 #FILE_SHARE_READ 的 CreateFile (http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx) 在第二次调用时总是失败,错误代码为 32: ERROR_SHARING_VIOLATION: - 进程无法访问该文件,因为它正被另一个进程使用。
以模式 FILE_SHARE_WRITE 或 FILE_SHARE_READ |FILE_SHARE_WRITE只有当FILE_SHARE_READ用于编写器应用程序时,文件才能被两个应用程序中的任何一个读取,然后它仅在读取器应用程序使用 FILE_SHARE_WRITE 或 FILE_SHARE_READ |#FILE_SHARE_WRITE,而不是使用 #FILE_SHARE_READ 时。奇怪。。。。有什么建议吗?
谢谢。
修正案:
Writer-Application: CreateFile(file,GENERIC_WRITE,FILE_SHARE_READ,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0)
Reader-Applications: CreateFile(file,GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0)
修正2:
当使用来自第一修正案的调用时,第一个读取器应用程序可以成功获取文件句柄,但第二个读取器应用程序将失败并ERROR_SHARING_VIOLATION。
修正3:有人指出了我的解决方案!
问题是我使用逻辑 Or 而不是按位 Or 作为共享模式:FILE_SHARE_READ 或 FILE_SHARE_WRITE = 1 或 2 = 1,但应FILE_SHARE_READ |FILE_SHARE_WRITE = 1 |2 = 3。所以无法按照编写器应用程序的要求工作FILE_SHARE_WRITE。
这并不奇怪,但它确实永远绊倒了程序员,逻辑是颠倒的。 当程序创建日志文件时,它只需指定FILE_SHARE_READ以允许另一个进程读取该文件。 然而,它在这样做时获得了另一种功能,它要求GENERIC_WRITE以便它可以写入文件。 操作系统没有异议,它将永远保持该功能,直到关闭文件。
然后出错的是另一个进程试图打开文件但拒绝写入文件的权利。 换句话说,只指定FILE_SHARE_READ而不指定FILE_SHARE_WRITE。 那行不通,第一个进程已经获得了写入权,你不能猛拉地板垫并说它不应该写入文件。 那将是一个令人讨厌的拒绝服务攻击。所以操作系统说不,并且 CreateFile() 调用失败。
另一个进程必须指定FILE_SHARE_WRITE。
您不能访问同一个文件进行两个不同的操作,例如 WRITE_TO
或 READ_FROM
。相反,您可以为两个不同的操作制作它的克隆。
您不能同时进行多个操作,即读/写操作。 如果文件不是太大,您可能必须在内存中复制它。
是的,我在内存映射文件方面遇到了同样的障碍 - 我想创建一个 mmap 文件以供多个进程读/写......在 Linux/MacOS 上作为一个魅力。
似乎您只能在Unix操作系统中执行此操作,我根本无法在Windows中重新创建此行为。