C标准库和系统调用

the*_*322 4 c system-calls

有没有办法找出C标准库中的哪些函数进行系统调用?他们中的一些人喜欢open,close而且malloc很明显,但是有哪种列表可以看一下吗?例如,strcpy做一个系统调用,或任何函数time.h

R..*_*R.. 7

我假设你从性能的角度提出要求,因为在很多情况下,运行时间完全由系统调用决定.

现在,虽然这是依赖于实现的(它甚至是依赖于实现的,无论是否存在"系统调用"),但推理和做出有根据的猜测的好方法是将"系统调用"视为"用户到内核 - "用户"权限转换,因为这是系统调用的全部内容.

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

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

最后,你有这样的操作open或者unlink必须要涉及一个用户到内核到用户的过渡,因为他们在处理上的权限必须执行共享资源(文件系统).

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