在比赛安全后是pwrite吗?

Dra*_*sha 2 c c++ linux multithreading file

在Linux上,pwrite操作(寻找+写入)是原子的,这意味着在具有一个文件描述符的多个线程中执行pwrite-s是安全的.我想使用dup()创建文件描述符副本.现在,拥有fd1和fd2 - 将pwrite-s按预期工作,还是存在竞争条件的危险?

Cha*_*via 5

通过dup共享相同文件状态创建的文件描述符对(例如,lseek对一个文件描述符的操作将影响另一个),因为它们引用进程打开文件表中的相同条目,这意味着它们基本上是无法区分的.他们唯一没有共同点的是文件描述符标志(例如FD_CLOEXEC.)

从手册页:

在从dup()或dup2()成功返回之后,旧的和新的文件描述符可以互换使用.它们引用相同的打开文件描述(参见open(2)),从而共享文件偏移量和文件状态标志; 例如,如果通过在其中一个描述符上使用lseek(2)修改文件偏移量,则另一个描述符的偏移量也会更改.

鉴于这dup允许您可以互换地使用这两个文件描述符(因为它们引用了进程文件表中的相同文件),我认为这意味着调用pwrite一个文件描述符与另一个文件描述符相同,因此是原子的.