我正在尝试使用
unshare
系统调用,但是我无法找到定义它的标头。我试过:
#define _GNU_SOURCE
#include <sched.h>
但没有结果(该函数不存在,我自己查看了标题)。我应该包含哪个标题?
我尝试但未能重现问题中的陈述:我的测试程序构建没有问题。
我查阅了
unshare(2)
手册页并发现了
SYNOPSIS
#define _GNU_SOURCE
#include <sched.h>
int unshare(int flags);
所以我写了一个小测试程序
#define _GNU_SOURCE
#include <sched.h>
int main(void)
{
unshare(123);
return 0;
}
然后我在启用所有警告并将其视为错误的情况下构建:
$ gcc -std=c11 -pedantic -Wall -Wextra -Werror -o unshare-ex unshare-ex.c
$ _
没有任何问题。
所以我用
重建了程序$ gcc -g -O2 -save-temps=obj -std=c11 -pedantic -Wall -Wextra -Werror -o unshare-ex unshare-ex.c
$ _
并查看了
unshare-ex.i
来跟踪包含文件。事实证明,/usr/include/sched.h
最终包含/usr/include/bits/sched.h
,其中包含unshare()
函数的定义,该函数扩展为
extern int unshare (int __flags) __attribute__ ((__nothrow__ , __leaf__));
但是用
/usr/include/bits/sched.h
写成
extern int unshare (int __flags) __THROW;
我不确定这里出了什么问题。
FWIW,
/usr/include/sched.h
和 /usr/include/bits/sched.h
均作为 glibc-headers-x86-2.35-15.fc36.noarch
包裹的一部分发货。
如果您想使用
unshare()
,您应该包括 sched.h,就像您所做的那样 #define _GNU_SOURCE
#include <sched.h>
unshare()
在哪里?unshare()
声明位于<bits/sched.h>
,您只能在那里找到外部定义,因为unshare()
是依赖于操作系统版本的系统调用。
_GNU_SOURCE
_GNU_SOURCE
是一个启用全套 glibc
扩展的宏。
如果你不想明确添加这个#define _GNU_SOURCE
。使用 gcc 编译时,您可以改为使用以下标志
gcc -D_GNU_SOURCE ...
显然不是
#define _GNU_SOURCE
应该是
#define __USE_GNU