【问题标题】:How to perform open system call in linux only if file exists and only if file doesn't exists?仅当文件存在且仅当文件不存在时,如何在linux中执行打开系统调用?
【发布时间】:2016-08-23 23:28:02
【问题描述】:

我现在正在学习 Linux 系统调用,我遇到了O_EXCL,我对 linux 中的open 系统调用几乎没有疑问。我有两个相互关联的具体疑问。

  1. 如何仅在文件存在的情况下打开文件(例如写入)?这意味着在这种情况下,如果文件不存在,我应该无法打开它。

  2. 如何仅在文件不存在时才打开文件(例如写入)?这意味着在这种情况下我应该无法打开一个文件,如果它存在的话。这类似于我猜的创建文件,但我只是想创建它并打开它以进行写入,如果文件已经存在,我不想打开它。

那么请给我完整的open 命令在Linux 中这两种情况?

谢谢

注意:另外请简要解释您的答案,我确实了解了不同的选项标志,例如 O_EXCLO_WRONLY 等,但如果我能对这些事情进行一些解释会更好。

【问题讨论】:

    标签: linux system-calls


    【解决方案1】:

    在第一种情况下,只需使用O_WRONLY - 如果没有O_CREAT,将不会创建文件。

    在第二种情况下,您使用O_WRONLY | O_CREAT | O_EXCL

    【讨论】:

    • 是的,第一种情况是有道理的,我的错我只是想得太用功了,而第二种情况我认为是让我有点难以理解的事情。如果我在您的第二个陈述中仅使用O_CREAT 或仅将O_EXCLO_WRONLY 结合使用会怎样?
    【解决方案2】:
    1. 您可以使用 stat 系统调用来确定文件是否存在。然后,如果存在,您可以打开带有标志 O_WRONLY 的文件。

    2. 如果您在上面的#1 中发现该文件不存在,您可以使用标志打开它,O_WRONLY | O_CREAT。由于您已经确保该文件不存在,因此不需要 O_EXCL。

    您可以通过使用 stat 系统调用跳过检查并使用 O_WRONLY | 打开文件来组合 #1 和 #2 O_CREAT。如果文件已经存在,它将被用于写入#1。如果它不存在,它将被创建并用于写入#2。

    【讨论】:

    • 不要这样做 - 你会有竞争条件。如果文件在stat 调用之后和open 调用之前被删除(或创建),这将不起作用。 @viraptor 的解决方案要好得多。
    猜你喜欢
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 2012-10-05
    相关资源
    最近更新 更多