Unable to read same file in parallel
我正在尝试同时读取两个不同应用程序中的日志文件。但是共享模式为#FILE_SHARE_READ的CreateFile(http://msdn.microsoft.com/zh-cn/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用于writer应用程序时,这两个应用程序中的任何一个都无法读取文件,然后仅在Reader-application使用FILE_SHARE_WRITE或FILE_SHARE_READ |时才起作用。 #FILE_SHARE_WRITE,而不是在使用#FILE_SHARE_READ时。奇怪...。有什么建议吗?
非常感谢你。
修正案:
1 2 | 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:有人指出了解决方案!
问题是我为共享模式使用了逻辑或而不是按位或:
FILE_SHARE_READ或FILE_SHARE_WRITE = 1或2 = 1,但应为FILE_SHARE_READ | FILE_SHARE_WRITE = 1 | 2 =3。因此无法正常运行,因为Writer-Application需要FILE_SHARE_WRITE。
这并不奇怪,但是它会使逻辑倒置永远使程序员绊倒。程序创建日志文件时,只需指定FILE_SHARE_READ即可允许另一个进程读取该文件。但是,这样做时它又获得了另一种功能,它要求提供GENERIC_WRITE,以便可以写入文件。没有来自操作系统的反对,它将永久保留该功能,直到关闭文件。
然后出问题的是另一个尝试打开文件但拒绝写入文件的权限的过程。换句话说,仅指定FILE_SHARE_READ,而不指定FILE_SHARE_WRITE。那行不通,第一个进程已经获得了写权限,您不能混用地板垫并说不应将其写入文件。那将是令人讨厌的拒绝服务攻击。因此,操作系统说"否",并导致CreateFile()调用失败。
另一个进程必须指定FILE_SHARE_WRITE。
您不能同时执行多项操作,即同时进行读/写操作。如果文件不太大,则可能需要在内存中进行复制。
您不能通过两个不同的操作(例如
是的,我与"内存映射文件"碰壁-我想创建一个mmap文件以通过多个进程进行读取/写入...在Linux / MacOS上具有吸引力。
看来您只能在Unix OS上执行此操作,我根本无法在Windows中重新创建此行为。