c - Linux 系统调用与 C 库函数

标签 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 库函数之间有点困惑!

编辑:为了补充问题,很多功能都在 (3) 但不在 (2) 下,即 clean .这是否意味着这些都是由 C 运行时直接完成的,而不依赖于系统调用和底层操作系统?

最佳答案

首先,了解 C 函数和系统调用是两个完全不同的事物

未包含在 C 库中的系统调用必须通过syscall 函数调用。此类调用的一个示例是 gettid

要使用 syscall 创建一个 gettid 系统调用包装器,请执行以下操作:

#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;
}

这是手册页的注释部分的摘录,其中明确指出此函数未在 C 库中定义:

NOTES
Glibc does not provide a wrapper for this system call; call it using syscall(2).


recvfrom 是一个围绕系统调用的 C 库包装器。
第 (2) 节中的所有内容都是系统调用。第 (3) 节中的所有内容都不是。第 (3) 节中的所有内容(除了一些值得注意的异常(exception),例如 getumask)在 C 库中都有定义。第 (2) 节中的大约一半内容在 C 库中没有定义(或包装器)(除了 POSIX 强制要求的函数和一些其他扩展,它们都有),如 gettid.

在 C 中调用 recvfrom 时,C 库调用内核来执行系统调用。

syscall函数是将系统调用号放入%eax寄存器并使用int $0x80的函数。

https://syscalls.kernelgrok.com/ 中看不到 recvfrom 的原因是因为https://syscalls.kernelgrok.com/非常非常不完整。

在 (3) 中有许多函数在 (2) 中看不到的原因是 (3) 中的许多函数没有系统调用。它们可能依赖也可能不依赖系统调用,它们只是没有具有支持它们的特定名称的系统调用。

关于c - Linux 系统调用与 C 库函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57734525/

相关文章:

c++ - 如何从 C 调用 C++ 函数?

php - 为 php 开发人员推荐的 linux 教程/书籍?

python - Linux Expect 教程示例问题

php - 通过 PHP 保护用于动态绘制可视化效果的 csv 文件

linux - ioctl 的工作原理(2)

c - 验证一个人是否存在的函数[比较 C 中的字符串]

SDL mutex可以加锁两次吗?

c - 如何防止内存泄漏

c++ - 如何获取 C/C++ 中 Linux 系统调用的输出?

linux - 如何利用您自己的编程语言使用 VDSO 对象?