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.h
和 sys/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;
}
我试图在我的 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.h
和 sys/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;
}