jos*_*osh 5 c linux system-calls
我对这两者有些困惑,所以这是我的问题。
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?
首先,要明白C函数和系统调用是两个完全不同的东西。
未包装在 C 库中的系统调用必须通过该syscall函数进行调用。此类调用的一个示例是gettid.
要使用 创建gettid系统调用包装器syscall,请执行以下操作:
#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;
}
Run Code Online (Sandbox Code Playgroud)
以下是手册页的“NOTES”部分的摘录,其中明确指出该函数未在 C 库中定义:
注意
Glibc 不提供此系统调用的包装器;使用 syscall(2) 调用它。
recvfrom是围绕系统调用的 C 库包装器。
第 (2) 节中的所有内容都是系统调用。第 (3) 节中的所有内容都不是。第 (3) 节中的所有内容(除了一些值得注意的例外,例如getumask)在 C 库中都有定义。第 (2) 节中大约一半的内容在 C 库中没有定义(或包装器)(POSIX 强制要求的函数和其他一些扩展除外,它们都有),就像gettid.
当在 C 中调用时recvfrom,C 库调用内核来执行系统调用。
该函数是将系统调用号放入寄存器并使用的syscall函数。%eaxint $0x80
recvfrom您在https://syscalls.kernelgrok.com/中看不到的原因是因为https://syscalls.kernelgrok.com/非常非常不完整。
(3) 中的许多函数在 (2) 中看不到的原因是因为 (3) 中的许多函数没有系统调用。它们可能依赖或不依赖系统调用,只是没有支持它们的特定名称的系统调用。