2

程序员知道他/她正在使用的标准库函数是否真的在执行系统调用真的很重要吗?如果是这样,为什么?

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

4

2 回答 2

1

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

于 2013-04-28T19:28:07.597 回答
1

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

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

    还值得注意的是 linux 的vsyscall(or vdso) 机制,它通过将某些系统调用 (ie gettimeofday) 的实现映射到用户空间内存来加速它们。有关更多详细信息,请参阅内容。

  2. 当您的程序需要通过系统调用审计部署到某些受限环境时。为了使您的程序能够在这样的环境中生存,可能有必要对您的程序进行分析以发现任何潜在的违反政策的行为,或者如果您在编写程序时就知道这些限制,那么可能就不那么严格了。

于 2013-04-28T20:09:44.460 回答