C标准库和系统调用

时间:2012-02-08 00:53:42

标签: c system-calls

有没有办法找出C标准库中的哪些函数进行系统调用?其中有些像openclosemalloc这些显而易见,但是有哪些列表可以看到吗?就像例如strcpy进行系统调用或time.h中的任何函数一样?

2 个答案:

答案 0 :(得分:7)

我假设你从性能的角度提问,因为在很多情况下,运行时间完全由系统调用支配。

现在,虽然这是依赖于实现的(它依赖于实现,无论是否存在“系统调用”),但推理和做出有根据的猜测的好方法是将“系统调用”视为“用户到” -kernel-to-user“权限转换,因为这实际上是系统调用。

考虑一下strcpy的示例。它将字符串从一个数组(在进程的内存空间中)复制到另一个数组(也在您的内存空间中)。它所做的任何事情都不涉及除这些字符串之外的任何数据,因此作为此操作的一部分进入内核空间将是非常病态的。

另一方面,请考虑time中的time.h函数。它返回当前系统时间。这是一个共享系统资源,因此您可能希望它需要输入内核空间来读取内核当前时间的记录。传统上,你是对的。然而,现代版本的Linux,至少在一些拱门上,将内核内存页面映射到每个用户进程为只读 - 包含只有内核才能更新的某些信息的页面,如系统时间,但都是进程可以自由地从用户空间读取而不泄漏任何秘密数据。所以这个更模糊。

最后,您有openunlink等操作必须必然涉及用户到内核到用户的转换,因为它们处理共享资源(必须强制执行权限的文件系统。

如果您想要一种更经验的方法来回答您的问题,您可以简单地编写一个简短的程序来调用您感兴趣的每个函数,并在strace下运行它。

答案 1 :(得分:1)

当程序需要与内核通信时进行系统调用。 strcpy进行系统调用效率非常低,因为这需要中断;你的代码停止运行,有一个上下文切换,CPU的执行模式改变(有更多的特权),中断处理程序将运行,你的代码将继续。这假设操作系统不会决定在中断之后运行另一个进程或者或者完全干扰你的代码(例如在等待读取时)。

你可以自问这个问题来自己回答这个问题:我可以写这个函数吗? (可以如此:物理上可能吗?)您可以编写自己的strcpy,但不能打开或读取。你可以编写自己的fopen,但必须打开。

维基百科上有一个很好的list of catagories for system calls。它会让你很好地了解何时需要进行系统调用。

This显示了如何在程序集中调用中断(这是您能够访问代码的唯一地方)。