我正在考虑我的代码中的极端情况,并且在检查文件是否存在时我无法弄清楚如何避免问题,如果不存在,则创建具有该文件名的文件。代码大致如下所示:
// 1
status = stat(filename);
if (!status) {
// 2
create_file(filename);
}
在调用1和2之间,另一个进程可以创建文件名。如何避免这个问题,是否有这种问题的一般解决方案?它们经常发生在系统编程中。
答案 0 :(得分:2)
您无论如何都应该创建文件,并让操作系统知道您是否希望在该过程中创建新文件(如果该文件尚不存在)。您之前不应该单独进行检查。
答案 1 :(得分:2)
这是O_EXCL | O_CREAT
open()
的标志设计用于:
如果设置了O_CREAT和O_EXCL,则如果文件存在,open()将失败。检查文件是否存在以及文件的创建(如果不存在)对于执行open()的其他线程应该是原子的,在O_EXCL和O_CREAT设置的同一目录中命名相同的文件名。如果设置了O_EXCL和O_CREAT,并且路径名称为符号链接,则open()将失败并将errno设置为[EEXIST],而不管符号链接的内容如何。如果设置了O_EXCL且未设置O_CREAT,则结果未定义。
所以:
fd = open(FILENAME, O_EXCL | O_CREAT | O_RDWR);
if (fd <0) { /* file exists or there were problems like permissions */
fprintf(stderr, "open() failed: \"%s\"\n", strerror(errno));
abort();
}
/* file was newly created */