使用open打开文件时,使用 O_CREAT 标志的话,就会在不存在文件的情况下去创建文件。所以说实际应该是有两个操作,一个是判断文件是否存在,另一个就是创建文件;而且这两个操作是作为一个原子操作执行的。如果不是作为一个原子操作执行的,那么就会分解成如下的程序段:
如果不作为一个原子操作执行那么在多进程中可能会出问题,假设两个操作不是作为原子操作执行的,当进程A在判断文件不存在后,便被挂起,进程B得以执行,然后创建了文件且向其中写入了数据,然后进程A被恢复,接着执行creat函数试图创建文件,而此时由于文件已存在,其中的内容会被truncate(截断)为 0 。这就导致了进程B的数据被擦除,出现错误。
时间: 2024-11-07 19:43:12