【问题标题】:Why do some Linux system calls not have a wrapper, but are documented as if they do?为什么有些 Linux 系统调用没有包装器,但被记录为好像有包装器一样?
【发布时间】:2019-08-31 14:32:28
【问题描述】:

我们以gettid系统调用为例:
http://man7.org/linux/man-pages/man2/gettid.2.html

我知道 gettid 没有在 libc 中实现,我需要直接进行系统调用才能使用它 (syscall(SYS_gettid))。我自己用这个 C 代码验证了这一点:

#include <stdio.h>
#include <sys/types.h>

int main(){

 pid_t a = gettid();
 return 0;
}

编译时不链接并给出此警告:warning: implicit declaration of function 'gettid'; did you mean 'getline'

现在我的问题是,为什么 Linux 文档记录了它,就好像这个函数确实存在一样?

SYNOPSIS 

   #include <sys/types.h>

       pid_t gettid(void);

他们没有关于如何进行直接系统调用的示例,而是有上面的代码 sn-p 不存在且无法使用。我有什么遗漏吗?

【问题讨论】:

  • @Scheff 没有任何问题,这是实际情况:ubuntuforums.org/showthread.php?t=345317,其他一些系统调用也存在问题。
  • @josh,您链接的文档指定了首先提供包装函数的 glibc 版本,以及在早期版本中必须使用的机制 (syscall())。那你到底在问什么?
  • 所以 linux 本身不提供任何包装器,这是 libc 的工作
  • josh 干得好,风格好,接受了我的狡猾提示。祝你好运。
  • @JohnBollinger 包装器已添加到 GlibC 版本 2.30,仅在四个星期前于今年 8 月 1 日发布,所以我们应该在这里给 OP 一点松懈,我认为 ;- )

标签: c linux system-calls


【解决方案1】:

系统调用在 GNU C 库(2.30 之前)中没有包装器,这只是函数的原型。

如手册页所述:

注意事项
Glibc 没有为这个系统调用提供包装器;使用 syscall(2) 调用它。

这是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;
}

如您所见,这与手册页中描述的原型相同。手册页中的原型仅供参考,因此如果您(或 libc 开发人员)如此选择,您可以围绕系统调用创建一个包装器。

如果您刚刚开始学习 C,我建议您停止尝试理解 C 库中的系统调用及其包装器,直到您对该语言有更多经验为止。差异就会很明显。

【讨论】:

  • 这个系统调用 does 在足够新的 Glibc 中有一个包装器,正如 OP 链接的在线手册页所表明的那样。从 cmets 来看,他们的部分困惑在于内核接口意义上的系统调用和包装函数意义上的系统调用之间的区别,以及提供后者的责任。
  • @JohnBollinger 我在对 OP 的另一个问题的回答中提到了这一点。见编辑。
猜你喜欢
  • 2019-02-22
  • 2020-07-24
  • 2016-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多