为什么有些 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 库中的系统调用和它们的包装器,直到您对该语言有了更多的经验。那么区别就很明显了。