为什么有些 Linux 系统调用没有包装器,但被记录为好像有包装器?
Why do some Linux system calls not have a wrapper, but are documented as if they do?
我们以gettid
系统调用为例:
http://man7.org/linux/man-pages/man2/gettid.2.html
我知道 gettid
没有在 libc 中实现,我需要直接进行系统调用才能使用它 (syscall(SYS_gettid)
)。我已经用这个 C 代码自己验证了这一点:
#include <stdio.h>
#include <sys/types.h>
int main(){
pid_t a = gettid();
return 0;
}
它不会 link 并在编译时给出此警告:warning: implicit declaration of function 'gettid'; did you mean 'getline'
.
现在我的问题是,为什么 Linux 文档记录它好像这个函数确实存在?
SYNOPSIS
#include <sys/types.h>
pid_t gettid(void);
他们没有关于如何进行直接系统调用的示例,而是他们有上面的代码片段,该代码片段不存在且无法使用。有什么我想念的吗?
系统调用在 GNU C 库(2.30 之前)中没有包装器,这只是函数如果有包装器的原型。
如手册页中所述:
NOTES
Glibc does not provide a wrapper for this system call; call it using syscall(2).
这是 gettid
包装器的示例:
#define _GNU_SOURCE
#include <sys/syscall.h>
#include <sys/types.h>
#include <unistd.h>
pid_t gettid(void)
{
pid_t tid = (pid_t)syscall(SYS_gettid);
return tid;
}
如您所见,这与手册页中描述的原型相同。手册页中的原型仅供参考,因此如果您(或 libc 开发人员)愿意,可以围绕系统调用创建一个包装器。
如果您刚刚开始学习 C,我建议您停止尝试理解 C 库中的系统调用和它们的包装器,直到您对该语言有了更多的经验。那么区别就很明显了。
我们以gettid
系统调用为例:
http://man7.org/linux/man-pages/man2/gettid.2.html
我知道 gettid
没有在 libc 中实现,我需要直接进行系统调用才能使用它 (syscall(SYS_gettid)
)。我已经用这个 C 代码自己验证了这一点:
#include <stdio.h>
#include <sys/types.h>
int main(){
pid_t a = gettid();
return 0;
}
它不会 link 并在编译时给出此警告:warning: implicit declaration of function 'gettid'; did you mean 'getline'
.
现在我的问题是,为什么 Linux 文档记录它好像这个函数确实存在?
SYNOPSIS
#include <sys/types.h>
pid_t gettid(void);
他们没有关于如何进行直接系统调用的示例,而是他们有上面的代码片段,该代码片段不存在且无法使用。有什么我想念的吗?
系统调用在 GNU C 库(2.30 之前)中没有包装器,这只是函数如果有包装器的原型。
如手册页中所述:
NOTES
Glibc does not provide a wrapper for this system call; call it using syscall(2).
这是 gettid
包装器的示例:
#define _GNU_SOURCE
#include <sys/syscall.h>
#include <sys/types.h>
#include <unistd.h>
pid_t gettid(void)
{
pid_t tid = (pid_t)syscall(SYS_gettid);
return tid;
}
如您所见,这与手册页中描述的原型相同。手册页中的原型仅供参考,因此如果您(或 libc 开发人员)愿意,可以围绕系统调用创建一个包装器。
如果您刚刚开始学习 C,我建议您停止尝试理解 C 库中的系统调用和它们的包装器,直到您对该语言有了更多的经验。那么区别就很明显了。