Linux kernel 真文件描述符克隆

Linux kernel 真文件描述符克隆,linux-kernel,handle,file-descriptor,dup,windows-nt,Linux Kernel,Handle,File Descriptor,Dup,Windows Nt,为什么在可能的情况下没有真正的文件描述符克隆机制,就像磁盘文件一样 POSIX: 从其中一个系统调用成功返回后,旧的和 新的文件描述符可以互换使用。他们指的是 相同的打开文件描述(参见打开(2)),因此共享文件偏移量 和文件状态标志;例如,如果文件偏移量由修改 在其中一个描述符上使用lseek(2),偏移量也会改变 另一方面 窗口: 复制控制柄引用与原始控制柄相同的对象。因此,对对象的任何更改都会通过两个控制柄反映出来。例如,如果复制文件句柄,则两个句柄的当前文件位置始终相同。要使文件句柄具有不

为什么在可能的情况下没有真正的文件描述符克隆机制,就像磁盘文件一样

POSIX:

从其中一个系统调用成功返回后,旧的和 新的文件描述符可以互换使用。他们指的是 相同的打开文件描述(参见打开(2)),因此共享文件偏移量 和文件状态标志;例如,如果文件偏移量由修改 在其中一个描述符上使用lseek(2),偏移量也会改变 另一方面

窗口:

复制控制柄引用与原始控制柄相同的对象。因此,对对象的任何更改都会通过两个控制柄反映出来。例如,如果复制文件句柄,则两个句柄的当前文件位置始终相同。要使文件句柄具有不同的文件位置,请使用CreateFile函数创建共享对同一文件的访问权限的文件句柄

拥有克隆原语的原因:

  • 在操作文件归档时,我希望归档中的每个文件都必须能够独立访问。文件归档的行为应该有点像虚拟文件系统

  • 文件类型检查。如果能够克隆文件偏移量,则可以读取文件的一小部分,而不会影响原始位置


你应该考虑以下内容:文件描述符仅仅是对“文件”数组(字面上,这就是所谓的)在内核端的对象指针的偏移。因此,当您复制文件描述符时,内核只需将文件指针的值从数组中的一个位置复制到另一个位置,并增加指向对象的引用计数

因此,您的问题不是文件描述符复制,而是文件偏移量的管理。简单的答案是:自己动手。也就是说,将当前文件偏移量与应用程序端的每个文件描述符显式关联

当然,最基本的文件访问系统调用
read()
write()
使用内核维护的文件偏移量变量(如果它可用)(并且只有在处理“正常”随机访问文件时才可用)。但是,更高级的文件访问系统调用期望应用程序在每次调用时提供所需的文件偏移量。这些包括
pread()
/
pwrite()
preadv()
/
pwritev()
aio_read()
/
aio_write
(后者可能是编写类似于您所描述的并行访问应用程序的最佳方法)


在Windows上,
ReadFile()
/
WriteFile()
ReadFileScatter()
/
WriteFile()
ReadFileEx()
/
WriteFile()
类似地期望在每次调用时(通过
lpOverlapped
参数)传递文件偏移量。

我认为它存在:dup()。是的,dup()共享相同的偏移量,但仍保持不同的描述符标志。或者,你可以将文件映射到两个不同的描述符中,并使用不同描述符的不同偏移量来解决问题?@PeterTeoh实际上,我想共享标志,但不共享偏移量