我想知道是否有任何libc函数不会调用任何系统调用()?例如,对于libc函数“strcpy()”,它是否为任何系统调用(让我们考虑所有可能的linux系统)。
答案 0 :(得分:5)
系统调用在性能上非常重要,因为它们意味着上下文切换到内核。因此,对于像strcpy
这样的简单库函数(其功能实际上等同于while(*d++ = *s++)
,但可能针对架构进行了优化),系统调用没有任何意义。
请注意,复制期间的页面错误可能导致内核上下文切换和系统调用的出现,但这不是strcpy
直接调用系统调用的结果。
答案 1 :(得分:4)
系统调用有点像用户域(程序运行的地方)到内核域的接口。当你正在做只有内核可以做的事情时,例如与硬件通信(例如从网卡读取字节,启动进程,甚至通过malloc分配内存(使用brk
)等),都需要它们。
另一方面,Userland函数(如strcpy
)不会缩进进行系统调用。他们不需要特殊的权限来做他们所做的事情,他们只是在用户土地上对进程的记忆进行操作。
由于系统调用引入了一个主要的性能损失(将模式从用户更改为内核并返回成本很高),在设计的角度来看,将这些函数放在一个常用的函数strcpy
中是没有意义的因此不太可能被看到。