了解标准库函数是否正在执行系统调用的重要性



对于程序员来说,知道他/她正在使用的标准库函数是否实际上正在执行系统调用实际上很重要吗?如果是,为什么?

直觉上,我猜唯一重要的是知道通用标准函数是库函数还是系统调用本身。在其他情况下,我猜没有必要知道库函数是否在内部使用系统调用。

并不总是能够(肯定地)知道库函数是否包装了系统调用。但无论如何,这些知识可以帮助提高程序的可移植性和(或)效率。至少在以下两种情况下,了解程序的系统调用级行为是有帮助的。

  1. 程序时间紧迫时。有些系统调用是昂贵的,而包装它们的库函数甚至更昂贵。因此,时间关键型任务可能需要切换到根本不进入内核空间的等效函数。

    值得注意的是linux的vsyscall(或vdso)机制,它通过将某些系统调用(即gettimeofday)的实现映射到用户空间内存来加速它们。

  2. 当您的程序需要部署到具有系统调用审计的受限环境中时。为了使您的程序在这样的环境中生存下来,可能有必要对您的程序进行分析,以防止任何潜在的策略违反,或者如果您在编写程序时意识到这些限制,则可能不那么困难。

有时候可能很重要,有时候不重要。我不认为这个问题有一个普遍的答案。我能想到的可能在某些上下文中很重要的原因是:如果系统调用需要用户可能没有的用户权限;在性能关键型代码中,系统调用可能过于重量级;如果你正在编写一个信号处理程序,其中大多数系统调用是禁止的;如果它可能会使用一些系统资源(例如,从/dev/random读取每个随机数可能会耗尽整个熵池-您想知道每次调用rand()时是否会发生这种情况)。

最新更新