Linux 上`unshare`在哪里定义?

问题描述 投票:0回答:3

我正在尝试使用

unshare
系统调用,但是我无法找到定义它的标头。我试过:

#define _GNU_SOURCE
#include <sched.h>

但没有结果(该函数不存在,我自己查看了标题)。我应该包含哪个标题?

c linux system-calls
3个回答
2
投票

我尝试但未能重现问题中的陈述:我的测试程序构建没有问题。

我查阅了

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
包裹的一部分发货。


0
投票

快速解答

如果您想使用

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 ...


-3
投票

显然不是

#define _GNU_SOURCE

应该是

#define __USE_GNU
© www.soinside.com 2019 - 2024. All rights reserved.