POSIX 规范的第 2.9.7 节“与常规文件操作的线程交互”中有部分答案:
所有函数chmod () , close () , fchmod () , fcntl () , fstat () , ftruncate () , lseek () , open () , read () , readlink () , stat () , symlink ( ) , 并写()当它们对常规文件进行操作时,它们在 IEEE Std 1003.1-2001 中指定的效果中相互之间应该是原子的。如果两个线程各自调用这些函数之一,则每个调用要么看到另一个调用的所有指定效果,要么一个都看不到。
因此,对于常规文件,如果进程的线程持有文件段上的锁并调用close()
与该文件关联的最后一个文件描述符,那么close()
(包括删除由该文件持有的所有未完成锁)的影响进程)对于fcntl()
另一个进程的线程调用以锁定文件段的影响是原子的。
状态规范exit()
:
这些函数将终止调用进程,结果如下:
据推测,打开的文件描述符就像通过适当的调用一样关闭close()
,但不幸的是,规范没有说明打开的文件描述符是如何“关闭”的。
2004 年的规范对于异常进程终止的步骤似乎更加模糊。我唯一能找到的是abort()
. 至少在 2008 年的规范中,页面上有一个标题为“进程终止的后果”_Exit()
的部分。但是,措辞仍然是:
- 在调用进程中打开的所有文件描述符、目录流、转换描述符和消息目录描述符都应关闭。
更新:我刚刚在 Austin Group Defect Tracker 中打开了问题 0000498。