1.原始语义
与O_CREATE标志组合起来调用open,确保指定的文件由open的调用者创建,否则返回错误。即,如果进程A用O_CREATE和O_EXCL标志来调用open,期望创建一个指定的文件file1,如果file1不存在,则open成功返回且创建file1,如果file1已经存在了(即不是由进程A创建的),那么open返回错误。
2.使用场景
O_CREATE|O_EXCL多用于确保一个一个程序只能执行单个进程,不能执行多个进程。原理如下,假设进程A是某程序的一个实例,如果它用O_CREATE|O_EXCL标志能够成功创建指定的文件,说明它是该程序的唯一实例,可以继续执行;如果返回错误,说明该文件已经存在,进而说明系统中已经运行着一个该程序的其它实例,检测到错误的返回值后,该实例就可以退出了。
之所以能这么用的唯一理由是该操作是原子的。
之所以这么说,理由如下。假设同样语义的非原子的操作流程如下:
if( access(file, R_OK) == -1 ) /* 首先检查文件是否存在 */
open(file, O_RDWR | O_CREAT,0666); /* 如果不存在,那我创建一个这样的文件 */
... /* 继续执行任务 */