为什么没有真正的文件描述符克隆机制,如果可能,就像磁盘文件一样。
POSIX:
从其中一个系统调用成功返回后,旧的和 新文件描述符可以互换使用。他们指的是 相同的打开文件描述(参见open(2)),从而共享文件偏移量 和文件状态标志;例如,如果文件偏移量被修改 在其中一个描述符上使用lseek(2),偏移也会改变 为了另一个。
视窗:
重复句柄指的是与原始句柄相同的对象。因此,对象的任何更改都通过两个句柄反映出来。例如,如果复制文件句柄,则两个句柄的当前文件位置始终相同。要使文件句柄具有不同的文件位置,请使用CreateFile函数创建共享对同一文件的访问权限的文件句柄。
拥有克隆原语的原因:
操作文件存档时,我希望存档中的每个文件都可以独立访问。文件存档应该有点像虚拟文件系统。
文件类型检查。能够克隆文件偏移使得可以在不影响原始位置的情况下读取文件的一小部分。
答案 0 :(得分:0)
您应该考虑以下内容:文件描述符只是"文件"的数组的偏移量。 (从字面上看,这就是他们所谓的)内核端的对象指针。因此,当您复制文件描述符时,内核将简单地将文件指针的值从数组中的一个位置复制到另一个位置,并在指向的对象上增加引用计数。
因此,您的问题不在于文件描述符重复,而在于文件偏移的管理。答案很简单:自己动手。也就是说,将当前文件偏移与应用程序端的每个文件描述符明确关联。
当然,最基本的文件访问系统调用read()
和write()
使用内核维护的文件偏移量变量(如果它可用)(并且它只有您正在处理"正常"随机访问文件)。但是,更高级的文件访问系统调用将期望应用程序在每次调用时提供所需的文件偏移量。其中包括pread()
/ pwrite()
,preadv()
/ pwritev()
和aio_read()
/ aio_write
(后者可能是编写并行访问应用程序的最佳方法就像你描述的那样。)
在Windows上,ReadFile()
/ WriteFile()
,ReadFileScatter()
/ WriteFileGather()
和ReadFileEx()
/ WriteFileEx()
类似地希望传递文件偏移量每次调用(通过lpOverlapped
参数)。