c - C 头文件是否包含在 Linux 内核中并由它们维护?
问题描述
查看此页面上的 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);
我的问题是:
是由 Linux 内核本身或其他项目
<unistd.h>
提供和维护的吗?libc
这些是一样的kernel headers
吗?如果它是由 Linux 本身提供的,那么他们为什么不提供定义,为什么只提供函数原型并将实现留给其他库,例如
libc
?如果不是由 Linux 本身提供,那为什么还要费心把函数原型放在这里呢?
libc
应该能够随心所欲地实现它。
解决方案
是由 Linux 内核本身或其他项目
<unistd.h>
提供和维护的吗?libc
这些是一样的kernel headers
吗?
不,unistd.h
当您#include <unistd.h>
不是来自 Linux 内核时使用的文件(即使它确实有一些具有该名称的文件)。它来自您的 libc,可能是glibc
:https ://sourceware.org/git/?p=glibc.git;a=blob;f=include/unistd.h;hb=HEAD 。
如果不是由 Linux 本身提供,那为什么还要费心把函数原型放在这里呢?libc 应该能够随心所欲地实现它。
约定是系统调用的 libc 包装器应该反映系统调用本身的名称和参数,因此 libc 之间确实没有偏差的余地。
推荐阅读
- sql - 尝试在 impala 中查找 LAST_VALUE() 时出错
- arrays - 如何使用 stringgrid 单元格的值存储在应该保存当前游戏状态的数组中?
- php - 如果 PHP 崩溃或调试停止,Nginx + PHP-FPM 如何返回 5xx 状态码?
- codeigniter - 调用未定义的方法 MY_Loader::_ci_load_class()
- typescript - 通过将字段添加到 Omit 类型并结合泛型来创建原始类型
- keycloak - 在密码页面或注册页面上显示 keycloak 密码策略
- spring-boot - ResponseStatusException 只能处理 Controller 层执行?无法处理抛出的拦截器的执行
- c++ - C++ 数组中最后一个元素后的逗号
- spring - org/springframework/core/NativeDetector java.lang.NoClassDefFoundError: org/springframework/core/NativeDetector 问题即将到来
- calendar - gmail 中的 ICS 文件 - EXDATE(不包括日期)在 gmail 中不起作用