在Linux上,pwrite操作(寻找+写入)是原子的,这意味着在具有一个文件描述符的多个线程中执行pwrite-s是安全的。 我想使用dup()创建文件描述符副本。现在,拥有fd1和fd2 - pwrite-s会按预期工作,还是存在竞争条件的危险?
答案 0 :(得分:5)
通过dup
创建的文件描述符对共享相同的文件状态(例如,对一个文件描述符的lseek
操作将影响另一个),因为它们引用相同的进程打开文件表中的条目,这意味着它们基本上无法区分。他们唯一没有共同点的是文件描述符标志(例如FD_CLOEXEC。)
从手册页:
从dup()成功返回后 或dup2(),旧文件和新文件 可以使用描述符 互换。他们指的是 相同的打开文件描述(见 open(2))因此共享文件偏移量 和文件状态标志;例如,如果 使用修改文件偏移量 lseek(2)在其中一个描述符上, 偏移也改变了 其他
鉴于dup
允许您使用两个文件描述符可互换,(因为它们引用了进程文件表中的相同文件),我认为这意味着调用{{1在一个上就像在另一个上调用它一样,因此是原子的。
答案 1 :(得分:1)
我认为pwrite是一个原子操作如果你写的字节数小于你写的管道的PIPE_BUF(来自POSIX programmer's manual)。