【问题标题】:how can I know if a function in C is a system call or not [closed]我怎么知道C中的函数是否是系统调用[关闭]
【发布时间】:2016-03-18 10:01:47
【问题描述】:

我真的不明白这个话题。例如,像

这样的函数
  • printf()
  • strlen()
  • malloc()

哪些是系统调用,哪些不是?当给我一个功能时,我怎么知道它?在 Google 上没有找到任何内容。

【问题讨论】:

  • 这是高度实现和平台相关的。我想知道你为什么想提前知道?
  • 什么是“系统调用”,为什么需要知道这个?
  • 最重要的问题是——你为什么需要这些信息?
  • 如果您不理解该主题,您可能应该从正确的结尾开始,并从更高层次上理解“系统调用”的概念开始。然后你应该问为什么你需要知道某个东西是否是系统调用 - 答案是非常依赖于平台的,在大多数情况下是完全没有意义的。
  • 在操作系统中测试。

标签: c call system


【解决方案1】:

这取决于系统。有一个手册页 syscalls 列出了 Linux 上的系统调用,例如:http://man7.org/linux/man-pages/man2/syscalls.2.html

此列表还取决于版本:新的系统调用偶尔会添加到 Linux 内核中。

列表中的函数都不是系统调用。但是,它们的实现可能使用系统调用:printf 使用write 系统调用,malloc 使用mmapmmap2brk 系统调用。相比之下,strlen 的典型实现不会使用系统调用。

【讨论】:

    【解决方案2】:

    系统调用由系统类型或您的架构定义。大多数情况下,您可以预期系统调用会对您的程序或系统本身产生一些影响,例如打印到终端、进程之间的通信、动态内存分配等等。

    大多数常用的系统调用都被标准库包装,如opensendclone等。要了解标准库中哪些函数是系统调用,您需要查看手册页。此外,您可以使用strace 工具检查您的程序调用了什么样的系统调用。一些更复杂的函数并不等同于系统调用,而是在下面使用它们——比如你的printfmalloc

    有些系统调用没有被标准库封装,只能显式调用:比如gettid只能和syscall(SYS_gettid)一起使用。

    【讨论】:

      【解决方案3】:

      您列出的这些函数都不是系统调用。这些都是 C 标准库中的所有函数,我认为其中没有系统调用。我认为,如果您想确定该函数是否为系统调用,则必须在 Google 上查找手册页或等效内容,例如每个函数。

      【讨论】:

      • printfmalloc 都在底层使用系统调用
      • @zoska 由于 printf 使用“underneath”系统调用,那么它是否使 printf() 成为系统调用?
      • @zoska 这也取决于平台。我见过他们不这样做的情况。
      • @l3x 我的解释是 C 和系统编程上下文中的系统调用是封装“真正”系统调用的 C 包装函数,更重要的是,它们的预期目的是 显式地 调用特定的系统调用。我不知道是否普遍正确的共识是间接调用系统调用作为其实现的副作用的函数本身就是系统调用,但我不这么认为。
      • 我不一定将“打印到终端”称为 printf()副作用,否则你只会获得 +1
      【解决方案4】:

      这里有几个概念:

      • 系统调用

      • 标准库

      系统调用将程序连接到特定的操作系统。这些调用执行一些标准功能,其实现取决于操作系统。例如,打开文件:open 在所有操作系统上都可用,但其实现取决于操作系统。

      此外,某些操作系统提供了其他操作系统没有的特殊功能。调用此功能使用仅存在于该操作系统上的系统调用。使用此功能的程序是不可移植的。

      标准库提供了许多程序需要的许多函数,例如使用sprintf 格式化字符串。通常这些函数也使用系统调用,例如printf 使用调用打印到stdout。标准库的功能在所有支持该语言的操作系统上都可用。

      【讨论】:

      • 您上次的更改并不完全正确。在所有 C 实现中 fopen 存在,但它的实现不同。虽然open 非常广泛可用,但您不应理所当然地认为它在所有实现中都可用。
      • @skyking 好吧,根据维基百科,它在“大多数”系统上可用:en.wikipedia.org/wiki/Open_%28system_call%29 在讨论中引入fopen 令人困惑,因为除了调用open 之外,它通常会做一些用户空间的事情.
      • @kfx 首先,它没有声明。其次,在某些操作系统上,在发出系统调用之前会完成一些用户空间的工作,并且在它之后也会完成一些用户空间的工作。这种操作系统最著名的例子可能是 windows。
      猜你喜欢
      • 2012-08-15
      • 2011-04-02
      • 2011-11-05
      • 2012-09-21
      • 1970-01-01
      • 2012-10-15
      • 1970-01-01
      • 2021-04-30
      • 1970-01-01
      相关资源
      最近更新 更多