假设我有一个文件描述符 4,用于读取/写入,并带有O_APPEND
写入标志。如果我有多个线程写入此文件,并且假设我想要定期切换 fd 4 指向的文件,那么我想要执行 dup2 调用以用新文件替换 fd 4。同时多个线程仍然会指向fd 4进行写入。我是否会丢失任何数据,或者正在写入的线程在切换期间是否会遇到错误?
答案1
Linux 手册页和 POSIX 描述相当清楚地表明它确实是原子的:
关闭和重用文件描述符的步骤
newfd
是原子执行的。
另一方面,dup2()函数提供独特的服务,因为没有其他接口能够自动替换现有的文件描述符。
我看不出有任何理由它在打开、关闭和复制文件描述符方面应该是原子的,但在读取或写入方面则不是。