获取GCC错误:“系统/内存时间:没有这样的文件或目录”

pbpqsu0x  于 2022-12-17  发布在  其他
关注(0)|答案(2)|浏览(238)

我尝试在我的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;
}

我希望上面的代码编译和运行没有错误。

fjaof16o

fjaof16o1#

在较旧的系统上,您必须为MFD_定义包含linux/memfd.h,并通过syscall(2) Package 器调用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;
}
lf3rwulv

lf3rwulv2#

Bionic(18.04)中的Ubuntu手册页没有更新此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编译,或者,按照手册页上说的那样,在包含头文件之前使用#define _GNU_SOURCE编译,但是,我建议只使用-D_GNU_SOURCE编译。

相关问题