如果我在一个线程中打开一个文件(使用 CreateFile())两次,这样我一次有两个有效的句柄,这两个文件句柄是否有一个共享的“文件指针”(SetFilePointer()),或者两个句柄有单独的独立“文件指针”?
如果在一个进程中有两个并发线程,并且它们每个都持有同一个文件的一个句柄,该怎么办。这两个句柄会有独立的文件指针吗?
每次线程打开文件时,都会创建一个带有一组新的句柄特定属性的新文件对象。例如,当前字节偏移属性是指文件中使用该句柄的下一次读取或写入操作将发生的位置。即使底层文件是共享的,文件的每个句柄都有一个私有字节偏移量。文件对象对于进程也是唯一的,除非进程将文件句柄复制到另一个进程(通过使用 Windows DuplicateHandle函数)或子进程从父进程继承文件句柄。在这些情况下,两个进程具有引用同一文件对象的不同句柄。Windows 内部结构 5
不同的文件句柄具有不同的文件指针,因此这些方案将毫无问题地工作(例如,两个线程可以“同时”从同一文件的不同部分读取,只要每个线程都独占使用自己的文件句柄)。
由不同调用创建的文件句柄CreateFile
具有独立的文件指针。您可以根据需要在单独的线程中使用它们。
DuplicateHandle
通过共享文件指针复制的句柄:不要使用它来获取要在另一个线程中使用的“单独”文件句柄。