为什么像 glibc 这样的程序需要 Linux 内核头文件? Linux API 通过系统调用提供,其他 libc 实现(例如 musl)不需要这些标头。
是什么让 glibc 如此特别?
答案1
除了调用机制之外,系统调用与普通函数调用没有什么不同。就像普通的 C 函数调用一样,您需要知道被调用函数所需的参数和类型,以及返回值是什么。作为示例,请看一下stat
将指向 的指针作为参数的系统调用struct stat
。内核和用户空间代码必须就数据的结构方式达成一致,而类型定义的最终来源是内核。
现在,由于内核 API 具有稳定性保证,因此这些数据类型很少发生变化。因此,Musl 开发人员发现,维护手动编辑的定义副本比依赖内核头文件更容易。例如,Musl 源代码在文件中包含它自己的系统调用号列表arch/x86_64/bits/syscall.h.in
。