在比赛安全后是pwrite吗?

时间:2009-12-03 13:23:38

标签: c++ c linux multithreading file

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

2 个答案:

答案 0 :(得分:5)

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

从手册页:

  

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

鉴于dup允许您使用两个文件描述符可互换,(因为它们引用了进程文件表中的相同文件),我认为这意味着调用{{1在一个上就像在另一个上调用它一样,因此是原子的。

答案 1 :(得分:1)

我认为pwrite是一个原子操作如果你写的字节数小于你写的管道的PIPE_BUF(来自POSIX programmer's manual)。