Getting GCC error: "sys/memfd.h: No such file or directory"

Getting GCC error: "sys/memfd.h: No such file or directory"

我试图在我的 C 代码中使用 memfd_create 系统调用。我试图包括 sys/memfd.h 作为 memfd_create 的手册页说的是合适的,但 GCC 给我错误 "sys/memfd: No such file or directory".

我试过谷歌搜索,但找不到遇到同样问题的人。我注意到 memfd_create 联机帮助页的某些版本说我应该包括 sys.mman.h,但当我尝试时它似乎没有帮助。它会说 memfd_create 被隐式声明。

这是我的问题的最小再现。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>

#include <sys/mman.h>

#include <sys/memfd.h>



int main(){

        int fd;
        fd = memfd_create("test", MFD_CLOEXEC);

        return 0;
}

我希望上面的代码能够编译并且 运行 没有错误。

Bionic (18.04) 中的 Ubuntu man-pages 不是最新的API(包括它在 Bionic 中的实现)。

The Focal man-page 正确显示了如何包含 memfd_create()。它说:

#define _GNU_SOURCE         /* See feature_test_macros(7) */
#include <sys/mman.h>

所以您只需要包含 <sys/mman.h>,并且您需要在编译器标志中使用 -D_GNU_SOURCE 进行构建。或者,按照手册页的说明,在包含 header 之前按字面意思 #define _GNU_SOURCE 进行操作。但是,我建议只用 -D_GNU_SOURCE 编译。

在旧系统上,您必须为 MFD_ 定义包含 linux/memfd.h,并通过 syscall(2) 包装器调用 memfd_create()(并包含 unistd.hsys/syscall.h 因为它有效)。

#define _GNU_SOURCE
#include <unistd.h>
#include <sys/syscall.h>
#include <linux/memfd.h>
#include <err.h>
int main(void){
        int fd;
        if((fd = syscall(SYS_memfd_create, "test", MFD_CLOEXEC)) == -1)
                err(1, "memfd_create");
        return 0;
}