手册中有多个章节。其中两个是:“C系统调用”和“C库例程”有什么区别?
2 Unix and C system calls 3 C Library routines for C programs
比如有getmntinfo(3)
和getfsstat(2)
,看起来都像他们做同样的事情。什么时候应该使用哪个和哪个区别?
手册中有多个章节。其中两个是:“C系统调用”和“C库例程”有什么区别?
2 Unix and C system calls 3 C Library routines for C programs
比如有getmntinfo(3)
和getfsstat(2)
,看起来都像他们做同样的事情。什么时候应该使用哪个和哪个区别?
系统调用是用户级代码和内核之间的接口。 C库例程与其他任何库函数一样,它们只是碰巧提供(非常普遍)。很多标准库例程都是围绕系统调用的包装器(很薄或以其他方式),这往往会使线条模糊不清。
至于哪一个使用,作为一般规则,使用最适合您的需求。
本手册第2部分描述的调用都是围绕对系统服务进行实际调用的相对较简单的包装,这些系统服务陷入内核。本手册第3节中描述的C标准库例程是客户端库函数,它们可能会或可能不会实际使用系统调用。
This posting描述了系统调用并捕获到内核(稍有不同的上下文),并解释了带有一些引用的系统调用背后的底层机制。
通用函数库建立在系统调用接口之上,但应用程序可以自由使用这两个函数。
系统调用就像有权使用内核资源的认证密钥。
上面的影像是由高级Linux编程,并有助于了解用户的应用程序如何与内核进行交互。
作为一般规则,您应该始终使用C库版本。他们通常拥有处理诸如信号重启等深奥内容的包装(如果你有要求的话)。如果您已经与图书馆建立了联系,情况尤其如此。所有规则都有理由被打破。原因使用直拨电话,
libc
不可知论的;也许与安装程序。无论使用哪种库,此类代码都可以在Android(bionic),uClibc和更传统的glibc/eglibc系统上运行。此外,动态加载与包装,使运行时glibc /仿生层允许双Android/Linux二进制。libc
偶尔可以做。initramfs
或init
;创建更小的图像或启动更快。initramfs
。libc
例程。libc
中的已知错误。libc
。对不起,大多数例子都是Linux专用的,但其理由应该适用于其他Unix变体。当新功能引入内核时,最后一项很常见。例如,当第一次引入kqueue
或epoll
时,没有libc
来支持它们。如果系统具有较旧的库,但是较新的内核并且您希望使用此功能,也可能会发生这种情况。
如果你的程序没有使用libc
,那么很可能是系统中的某些东西。通过为自己的变体编码,您可以通过提供两条路径来实现相同的最终目标,从而取消缓存。此外,Unix 将在进程之间共享代码页。通常没有理由不使用libc
版本。
其他答案已经在libc
和系统调用之间的区别做了一个很好的工作。
真棒图片。非常清楚 – henryyao 2013-04-11 01:33:05