检查文件是否存在然后创建它时如何避免竞争条件?

时间:2014-07-12 11:18:33

标签: race-condition systems-programming

我正在考虑我的代码中的极端情况,并且在检查文件是否存在时我无法弄清楚如何避免问题,如果不存在,则创建具有该文件名的文件。代码大致如下所示:

// 1
status = stat(filename);
if (!status) {
  // 2
  create_file(filename);
}

在调用1和2之间,另一个进程可以创建文件名。如何避免这个问题,是否有这种问题的一般解决方案?它们经常发生在系统编程中。

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 */