“C 系统调用”和“C 库例程”有什么区别?
题
联机帮助页中有多个部分。其中两个是:
2 Unix and C system calls 3 C Library routines for C programs
例如有 getmntinfo(3)
和 getfsstat(2)
, ,两者看起来都在做同样的事情。什么时候应该使用哪个以及有什么区别?
其他提示
系统调用是用户级代码和内核之间的接口。 C库例程库调用像任何其他的,他们只是碰巧真正共同提供(非常普遍)。很多标准库例程的是包装器系统调用(薄或以其它方式),其不趋向于模糊行了一下。
至于要使用哪一个,作为一般规则,使用最适合自己需求的。
的共同功能的库构建在系统调用接口的顶部上,但应用程序可以随意使用这两者。
系统调用是等,其必须使用的内核资源的访问的认证密钥。
上面的影像是由高级Linux编程,并有助于了解用户的应用程序如何与内核进行交互。
在该手册的第2节中所述的呼叫是围绕实际调用所有相对薄的包装系统服务陷阱给内核。在手动的第3节中所描述的C标准库例程是客户端库功能,可能会或可能不会实际使用的系统调用。
作为一般规则,您应该始终使用 C 库版本。他们通常有包装器来处理深奥的事情,例如根据信号重新启动(如果您有要求)。如果您已经与该库链接,则尤其如此。所有规则都有被打破的理由。使用直接呼叫的原因,
- 你想成为
libc
不可知论者;也许有安装程序。此类代码可以在 Android 上运行(仿生的), uClibc, ,以及更传统的 glibc/eglibc 系统,无论使用什么库。此外,使用包装器动态加载以创建运行时 glibc/bionic 层,允许双 Android/Linux 二进制文件。 - 您需要极致的性能。尽管这种情况可能很少见,而且很可能被误导。重新思考这个问题可能会带来更好的性能收益,并且 不是 调用系统通常会带来性能胜利,
libc
偶尔可以做。 - 你正在写一些
initramfs
或者init
没有库的代码;创建更小的映像或更快地启动。 - 您正在测试新的内核/平台,并且不想让成熟的文件系统使生活变得复杂;非常类似于
initramfs
. - 您希望在程序启动时非常快地执行某些操作,但最终希望使用
libc
例程。 - 为了避免已知的错误
libc
. - 该功能无法通过
libc
.
抱歉,大多数示例都是 Linux 特定的,但其原理应该适用于其他 Unix 变体。当新功能引入内核时,最后一项非常常见。例如当 kqueue
或者 epoll
最初引入的地方没有 libc
支持他们。如果系统有较旧的库,但有较新的内核并且您希望使用此功能,也可能会发生这种情况。
如果您的进程没有使用 libc
, ,那么系统中很可能会有某些东西。通过编写自己的变体,您可以通过提供通往同一最终目标的两条路径来取消缓存。此外,UNIX将共享过程之间的代码页面。一般来说,没有理由不使用 libc
版本。
其他答案已经在区分两者之间做出了出色的工作 libc
和系统调用。