c - 是否存在其定义调用另一个系统调用函数的系统调用函数?

标签 c linux system-calls

在Linux中,有没有一个系统调用函数的定义调用了另一个系统调用函数?

或者在任何系统调用函数不调用另一个系统调用函数的意义上,所有系统调用函数是否彼此排斥?

或者系统调用函数大部分在上述意义上是相互排斥的吗?

谢谢。

最佳答案

作为例子,让我们看看 C 函数是如何实现 write() 的。在 Linux 中实现。

C 库实现本质上是:

ssize_t write(int fd, const void *buf, size_t count)
{
    long retval;

    retval = syscall(__NR_write, fd, buf, count);
    if (retval < 0) {
        errno = -retval;
        return -1;
    } else
        return retval;
}

syscall() 函数特定于每个硬件体系结构、操作系统和内核。它通常是用汇编语言编写的。它将参数加载到特定的寄存器(根据使用的内核调用约定),并调用到内核中。

此时,安全边界被跨越,执行转移到内核空间。

内核中的 write() 系统调用实现本身使用调用进程的文件描述表来查找特定于该文件或套接字的一组文件操作;确切的代码路径取决于文件描述符是文件(在这种情况下,它所在的文件系统)、管道、套接字、字符设备还是 block 设备。

几乎所有的系统调用都返回一个非负值表示成功,返回一个负的 errno 代码表示错误。

在 Linux 内核中,系统调用实现很少调用另一个实现系统调用的函数。相反,公共(public)部分被分解为两个系统调用实现函数调用的内核内部函数。这使维护更容易。

如果我们看看 Linux 内核如何实现 faccessat()access()系统调用,我们看到两者都简单地调用内核内部函数 do_faccessat()

关于c - 是否存在其定义调用另一个系统调用函数的系统调用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50043794/

相关文章:

LINUX 如何获取未运行的 PID-s?

linux - Linux内核中的系统调用是如何定义的? compat_sys_xxx 和 sys_xxx 之间有什么关系?

linux - 系统调用如何知道包装函数将其参数放入何处?

c - Linux C : "Interactive session" with separate read and write named pipes?

c - C语言读取文件

c - OpenMP 中的缩减操作在幕后是如何工作的?

java - 用户空间线程和内核空间线程的示例

linux - 我正在寻找一种从基本 shell 脚本以序列化方式调用多个 shell 脚本的方法

c - 让字符超过 C 文件中的某个点

c - C 中使用 char 指针的段错误