获取GCC错误:";sys/memfd.h:没有这样的文件或目录;

获取GCC错误:";sys/memfd.h:没有这样的文件或目录;,c,linux,ubuntu,include,system-calls,C,Linux,Ubuntu,Include,System Calls,我试图在我的C代码中使用memfd_create系统调用。我试图包括sys/memfd.h,正如memfd_create的手册页所说的那样是合适的,但GCC告诉我错误“sys/memfd:没有这样的文件或目录” 我试着在谷歌上搜索,却找不到有同样问题的人。我注意到memfd_create的manpage的一些版本说我应该包括sys.mman.h,但当我尝试它时,它似乎没有帮助。它会说memfd_create是隐式声明的 这是我的问题的一个极小的再现 #include <stdio.h>

我试图在我的C代码中使用memfd_create系统调用。我试图包括sys/memfd.h,正如memfd_create的手册页所说的那样是合适的,但GCC告诉我错误“sys/memfd:没有这样的文件或目录”

我试着在谷歌上搜索,却找不到有同样问题的人。我注意到memfd_create的manpage的一些版本说我应该包括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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(){
int-fd;
fd=memfd_create(“测试”,MFD_CLOEXEC);
返回0;
}

我希望上面的代码编译和运行时不会出错。

Bionic(18.04)中的Ubuntu手册页不符合此API的最新版本(包括它在Bionic中的实现)

正确显示如何包含
memfd\u create()
。它说:

#define _GNU_SOURCE         /* See feature_test_macros(7) */
#include <sys/mman.h>
#定义GNU源代码/*请参见功能测试宏(7)*/
#包括

因此,您只需要包含
,并且需要在编译器标志中使用
-D_GNU_SOURCE
进行构建。或者,在包含标题之前,按照手册页上的说明执行并字面上定义源代码。但是,我建议只使用
-D_GNU_SOURCE
进行编译。

在较旧的系统上,必须将
linux/memfd.h
包含在
MFD
定义中,并通过
syscall(2)
包装器调用
memfd_create()
(包括
unistd.h
sys/syscall.h
,用于it工作)

定义GNU源
#包括
#包括
#包括
#包括
内部主(空){
int-fd;
if((fd=syscall(SYS_memfd_create,“test”,MFD_CLOEXEC))=-1)
err(1,“memfd_create”);
返回0;
}

这不适用于“旧”系统,例如debian stable(9.9)或centos 7。是的,手册页错误地告诉你在这样的系统中包含
sys/memfd.h
,所以教你如何键入
man memfd\u create
确实有点丰富。@mosvy的“丰富”是告诉那些试图帮助你的人他们所做的事情“有点丰富”。这个问题被标记为“ubuntu”,这是一个可能的答案。如果它解决了OP的问题,那就太好了。如果没有,那就不会了。这成功了!非常感谢你的帮助!巧合的是,我似乎记得以前见过你的答案(可能好几次),所以我非常感谢你的贡献。我想问一下,为什么您更喜欢使用-D_GNU_SOURCE编译,而不是将define放在代码中?@chillsauce因为它避免了一些其他头首先包含它的问题,而无需在一些具有不同glibc版本的系统上定义宏。这可能导致生成失败。使用编译器标志定义它可以避免这个问题。您会发现,大多数依赖GNU和/或Linux、POSIX、SystemV或BSD特定库函数的项目通常使用
-D_GNU_SOURCE-D_SVID_SOURCE-D_DEFAULT_SOURCE
构建。
#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;
}