原子地创建文件

时间:2015-11-18 12:40:29

标签: c linux posix

我遇到了这段代码,根据作者不应该工作,但它运行成功。作者建议使用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);
    }
}  

1 个答案:

答案 0 :(得分: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指定文件的访问/共享权限所需的参数。 Linux和Windows之间的标志不同。