我尝试在我的C代码中使用memfd_create
系统调用,我尝试包含sys/memfd.h
,因为memfd_create
的手册页说这是合适的,但是GCC给了我一个错误“sys/memfd:无此档案或目录''。
我试着在Google上搜索,没有发现任何人有同样的问题。我注意到一些版本的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;
}
我希望上面的代码编译和运行没有错误。
2条答案
按热度按时间fjaof16o1#
在较旧的系统上,您必须为
MFD_
定义包含linux/memfd.h
,并通过syscall(2)
Package 器调用memfd_create()
(并包含unistd.h
和sys/syscall.h
以使其工作)。lf3rwulv2#
Bionic(18.04)中的Ubuntu手册页没有更新此API(包括其在Bionic中的实现)。
The Focal man-page正确地显示了如何包含
memfd_create()
。它说:所以你只需要包含
<sys/mman.h>
,并且你需要在编译器标志中使用-D_GNU_SOURCE
编译,或者,按照手册页上说的那样,在包含头文件之前使用#define _GNU_SOURCE
编译,但是,我建议只使用-D_GNU_SOURCE
编译。