以原子方式创建文件
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
导致文件存在时调用失败。
mode
是 O_CREAT
所需的参数,用于指定文件的 access/sharing 权限。 Linux 和 Windows 之间的标志不同。
我遇到了这段代码,根据作者的说法,它不应该工作,但是,它运行成功。作者推荐使用 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
导致文件存在时调用失败。
mode
是 O_CREAT
所需的参数,用于指定文件的 access/sharing 权限。 Linux 和 Windows 之间的标志不同。