以原子方式创建文件

Creating a file atomically

我遇到了这段代码,根据作者的说法,它不应该工作,但是,它运行成功。作者推荐使用 O_CREAT 做同样的事情但保证原子性。在我看来,两个进程是否 运行 并发,代码应该仍然有效?

if((fd=open("filename.dat", O_WRONLY) < 0)){
    if(errno != ENOENT){
        perror("open error");
        exit(1);
    }
    else if((fd=open("filename.dat", O_WRONLY | O_CREAT)) < 0){ 
        perror("creation error");
        exit(1);
    }
}  

原子性由操作系统提供:文件存在或不存在,但是,在调用之间,例如access() 检查是否存在并 open() 创建文件,另一个进程可能已经创建了文件。因此,必须在一次调用中以原子方式创建文件:

if ((fd=open("filename.dat", O_WRONLY | O_CREAT | O_EXCL, mode))<0) {
    // file exists or other error

O_EXCL 导致文件存在时调用失败。

modeO_CREAT 所需的参数,用于指定文件的 access/sharing 权限。 Linux 和 Windows 之间的标志不同。