线程和文件描述符

22

一个进程内的不同线程是否有独立的文件描述符表?如果同一进程中的多个线程同时访问单个文件,那么由不同线程执行的两个open调用的文件偏移是否为特定于线程的?

4个回答

21

不,每个进程只有一个文件描述符表,并且它在所有线程之间共享。

根据您的问题描述,您可能需要查看pread()和pwrite()函数。


+1 是因为包含了解决方案,以及 preadpwrite - R.. GitHub STOP HELPING ICE

12

文件描述符在线程之间是共享的。如果你想要“线程特定”的偏移量,为什么不让每个线程使用一个不同的文件描述符(open(2)多次)呢?


1
@trojanfoe 不行,dupdup2不行(他需要“线程特定”的偏移量)。 - cnicutar
dup() 只是复制文件描述符,而不是复制代表打开文件的内核结构。 - Lipika Deka

1

尝试使用pread()/pwrite()。

您仍然可以在多个线程之间共享同一文件描述符,即使用pread()/pwrite()进行并行读/写将保证是原子操作,因为您需要分别指定偏移量和要读取/写入的字节数。


0
在Linux中,您可以通过CLONE_FILES标志使用unshare()文件描述符表,但我建议不要这样做。

请注意,这不会解决“共享偏移量”问题。即使两个线程不再共享它们的fd表(即使它们最初是具有单独fd表的单独进程),两个指向同一“打开文件描述符”的文件描述符始终共享偏移量。 - R.. GitHub STOP HELPING ICE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接