我遇到了这段代码,根据作者不应该工作,但它运行成功。作者建议使用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);
}
}
答案 0 :(得分:1)
原子性由操作系统提供:文件存在,或者不是在例如调用例如文件的情况下。 access()
检查是否存在并open()
创建文件,另一个进程可能已创建该文件。因此,必须在一次调用中以原子方式创建文件:
if ((fd=open("filename.dat", O_WRONLY | O_CREAT | O_EXCL, mode))<0) {
// file exists or other error
当文件存在时, O_EXCL
会导致调用失败。
mode
是O_CREAT
指定文件的访问/共享权限所需的参数。 Linux和Windows之间的标志不同。