查看此页面上的Linux系统调用:
https://man7.org/linux/man-pages/dir_section_2.html
大多数sys调用都有一个可供使用的libc wrapper
函数。让我们以gettid
为例:https://man7.org/linux/man-pages/man2/gettid.2.html
#include <unistd.h>
pid_t gettid(void);
我的问题是:
<unistd.h>
是由Linux内核本身提供和维护的,还是由libc
或其他项目提供和维护?这些与kernel headers
相同吗?如果它是由Linux自己提供的,那么他们为什么不提供定义,为什么只提供函数原型,并将实现留给
libc
等其他库?如果不是由Linux本身提供的,那么为什么要麻烦把函数原型放在这里呢?
libc
应该能够随心所欲地实现它。
<unistd.h>
是由Linux内核本身提供和维护的,还是由libc
或其他项目提供和维护?这些与kernel headers
相同吗?
不,#include <unistd.h>
时使用的unistd.h
文件不是来自Linux内核(尽管它确实有一些同名文件(。它来自您的libc,可能是glibc
:https://sourceware.org/git/?p=glibc.git;a=斑点;f=包含/unistd.h;hb=水头。
如果不是由Linux自己提供的,那么为什么要麻烦把函数原型放在这里呢?libc应该能够随心所欲地实现它。
约定是系统调用的libc包装器应该镜像系统调用本身的名称和参数,因此libc之间确实没有偏差的空间。