代码之家  ›  专栏  ›  技术社区  ›  Mark Galeck

声明O_NOATIME的地方记录在哪里?

  •  0
  • Mark Galeck  · 技术社区  · 4 年前

    当我试图编译这个SSCCE代码时(在Ubuntu 16.04内核4.15上)

    // defines and include needed according to openat manpage at man7.org
    #define _POSIX_C_SOURCE 200809L
    #define _ATFILE_SOURCE
    #include <sys/types.h>  // additional include according to die.net , but not man7.org
    #include <sys/stat.h>   // additional include according to die.net , but not man7.org
    #include <fcntl.h>  
    
    int main() {
        openat(3, "foobar", O_NOATIME, 0);
    }
    

    我明白

    error: ‘O_NOATIME’ undeclared 
    

    我不是真的在找人告诉我:“它在文件里 <xxx.h> ,包括它”。我可以发现它恰好在我的系统中。

    我正在编写的代码不仅我必须在这个系统上编译,我很高兴,而且会由其他人或其他系统编译。我必须根据一些信誉良好的来源(如man7或die.net,但他们的文档对我不起作用)中的文档编写所有代码。这样做的原因是“似是而非的否认”——如果他们不能编译,我不能只说“它对我有用”——那将是站不住脚的;我需要能够说“它在某个神圣的来源中说它应该起作用”,“我检查过了”。

    0 回复  |  直到 4 年前
        1
  •  3
  •   KamilCuk    4 年前

    从…起 https://man7.org/linux/man-pages/man2/open.2.html :

    O_DIRECT、O_NOATIME、O_PATH和O_TMPFILE标志是特定于Linux的。必须定义_GNU_SOURCE才能获得它们的定义。

    你必须定义 _GNU_SOURCE 和 #include <fcntl.h> 。