2009-02-21 63 views

回答

30

系统调用是操作系统函数,就像在UNIX上一样,malloc()函数建立在sbrk()系统调用之上(用于调整进程内存空间大小)。

库只是应用程序代码,它不是操作系统的一部分,并且通常可用于多个操作系统。它们与您自己的程序中的函数调用基本相同。

该行可能有点模糊,但只是将系统调用视为内核级功能。

12

系统调用是用户级代码和内核之间的接口。 C库例程与其他任何库函数一样,它们只是碰巧提供(非常普遍)。很多标准库例程都是围绕系统调用的包装器(很薄或以其他方式),这往往会使线条模糊不清。

至于哪一个使用,作为一般规则,使用最适合您的需求。

6

本手册第2部分描述的调用都是围绕对系统服务进行实际调用的相对较简单的包装,这些系统服务陷入内核。本手册第3节中描述的C标准库例程是客户端库函数,它们可能会或可能不会实际使用系统调用。

This posting描述了系统调用并捕获到内核(稍有不同的上下文),并解释了带有一些引用的系统调用背后的底层机制。

11

通用函数库建立在系统调用接口之上,但应用程序可以自由使用这两个函数。

系统调用就像有权使用内核资源的认证密钥。

enter image description here

上面的影像是由高级Linux编程,并有助于了解用户的应用程序如何与内核进行交互。

+0

真棒图片。非常清楚 – henryyao 2013-04-11 01:33:05

3

作为一般规则,您应该始终使用C库版本。他们通常拥有处理诸如信号重启等深奥内容的包装(如果你有要求的话)。如果您已经与图书馆建立了联系,情况尤其如此。所有规则都有理由被打破。原因使用直拨电话,

  1. 你想成为libc不可知论的;也许与安装程序。无论使用哪种库,此类代码都可以在Android(bionic),uClibc和更传统的glibc/eglibc系统上运行。此外,动态加载与包装,使运行时glibc /仿生层允许双Android/Linux二进制。
  2. 您需要极高的性能。虽然这可能很少见,而且很可能被误导了。可能重新考虑问题会带来更好的性能优势,并且不是调用系统往往是性能赢,其中libc偶尔可以做。
  3. 您正在编写一些不带库的代码initramfsinit;创建更小的图像或启动更快。
  4. 您正在测试新的内核/平台,并且不希望使用完整的文件系统使生活复杂化;非常类似于initramfs
  5. 您希望在程序启动时非常快速地执行某些操作,但最终需要使用libc例程。
  6. 为了避免libc中的已知错误。
  7. 该功能不可用,通过libc

对不起,大多数例子都是Linux专用的,但其理由应该适用于其他Unix变体。当新功能引入内核时,最后一项很常见。例如,当第一次引入kqueueepoll时,没有libc来支持它们。如果系统具有较旧的库,但是较新的内核并且您希望使用此功能,也可能会发生这种情况。

如果你的程序没有使用libc,那么很可能是系统中的某些东西。通过为自己的变体编码,您可以通过提供两条路径来实现相同的最终目标,从而取消缓存。此外,Unix 将在进程之间共享代码页。通常没有理由不使用libc版本。

其他答案已经在libc和系统调用之间的区别做了一个很好的工作。