我对这两者有些困惑,所以这是我的问题。
Linux手册页项目列出了所有这些功能:https : //www.kernel.org/doc/man-pages/
纵观recvfrom作为一个例子,这个功能既存在作为一个Linux系统调用以及C库函数。他们的文档似乎有所不同,但使用都可以访问#include <sys/socket.h>。我不明白他们的区别吗?
我还认为系统调用是使用可以直接在汇编中实现的十六进制值定义的,其列表在此处:https : //syscalls.kernelgrok.com/
但是我recvfrom在上面的链接中找不到。在这一点上,我对Linux系统调用与C lib函数之间有些困惑!
编辑:要添加到问题,很多功能在(3)下,但不在(2)下,即clean。这是否意味着这些操作是直接由C运行时完成的,而不依赖于系统调用和底层OS?
让我们以gettid系统调用为例:
http ://man7.org/linux/man-pages/man2/gettid.2.html
我知道gettidlibc 中没有实现,我需要直接进行系统调用才能使用它(syscall(SYS_gettid))。我自己用这个 C 代码验证了这一点:
#include <stdio.h>
#include <sys/types.h>
int main(){
pid_t a = gettid();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它不链接并在编译时给出此警告:warning: implicit declaration of function 'gettid'; did you mean 'getline'。
现在我的问题是,为什么 Linux 文档记录它就好像这个函数确实存在一样?
SYNOPSIS
#include <sys/types.h>
pid_t gettid(void);
Run Code Online (Sandbox Code Playgroud)
他们没有如何进行直接系统调用的示例,而是有上述不存在且无法使用的代码片段。我有什么遗漏的吗?