什么';这两者之间的区别是什么;C系统调用";及;C库例程“;?

什么';这两者之间的区别是什么;C系统调用";及;C库例程“;?,c,unix,system,manpage,C,Unix,System,Manpage,手册页中有多个部分。其中两项是: 2 Unix and C system calls 3 C Library routines for C programs 2个Unix和C系统调用 用于C程序的3个C库例程 例如,有和,它们看起来做的事情都一样。什么时候应该使用哪个?有什么区别?系统调用是操作系统函数,就像在UNIX上一样,该函数构建在系统调用之上(用于调整进程内存空间的大小) 库只是不属于操作系统的应用程序代码,通常可以在多个操作系统上使用。它们基本上与您自己的程序中的函数调

手册页中有多个部分。其中两项是:

2 Unix and C system calls 3 C Library routines for C programs 2个Unix和C系统调用 用于C程序的3个C库例程
例如,有和,它们看起来做的事情都一样。什么时候应该使用哪个?有什么区别?

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

库只是不属于操作系统的应用程序代码,通常可以在多个操作系统上使用。它们基本上与您自己的程序中的函数调用相同


这条线可能有点模糊,但只将系统调用视为内核级功能。

系统调用是用户级代码和内核之间的接口。C库例程和其他任何库调用一样都是库调用,它们恰好是真正普遍提供的(几乎是普遍提供的)。许多标准库例程都是围绕系统调用的包装器(精简或其他),这确实会使行变得模糊


至于使用哪一个,一般来说,使用最适合您需要的调用。

本手册第2节中描述的调用都是对系统服务的实际调用的相对较薄的包装,这些调用会捕获内核。本手册第3节中描述的C标准库例程是客户端库函数,可能使用也可能不实际使用系统调用


描述了系统调用和内核捕获(在一个稍微不同的上下文中),并通过一些引用解释了系统调用背后的底层机制

常用函数库构建在系统调用接口之上,但应用程序可以免费使用这两个库

系统调用类似于有权使用内核资源的身份验证密钥


上图来自高级Linux编程,有助于理解用户应用程序如何与内核交互。

一般来说,您应该始终使用C库版本。它们通常有包装器来处理深奥的事情,比如信号重启(如果您要求的话)。如果已经与库链接,则尤其如此。所有的规则都有被打破的理由。使用直拨电话的原因

  • 你想成为
    libc
    不可知论者;可能需要安装程序。这样的代码可以运行在Android()和更传统的glibc/eglibc系统上,而不考虑所使用的库。此外,还可以使用包装器动态加载,以创建运行时glibc/bionic层,从而允许使用双Android/Linux二进制文件
  • 你需要卓越的表现。虽然这可能是罕见的,而且很可能是误导。重新思考这个问题可能会带来更好的性能优势,不调用系统通常是一个性能胜利,
    libc
    偶尔也能做到这一点
  • 您正在编写一些没有库的
    initramfs
    init
    代码;创建更小的映像或更快地启动
  • 您正在测试一个新的内核/平台,不想用一个成熟的文件系统使生活复杂化;非常类似于
    initramfs
  • 您希望在程序启动时快速执行某些操作,但最终希望使用
    libc
    例程
  • 避免
    libc
    中的已知错误
  • 该功能无法通过
    libc
    获得
  • 很抱歉,大多数示例都是特定于Linux的,但是理性应该适用于其他Unix变体。最后一项在内核中引入新特性时非常常见。例如,在最初引入时或引入地点,没有
    libc
    支持它们。如果系统有较旧的库,但有较新的内核,并且您希望使用此功能,也可能会发生这种情况

    如果您的流程没有使用
    libc
    ,那么系统中很可能会出现问题。通过编码您自己的变体,您可以通过提供两条通向同一最终目标的路径来否定缓存。还有,Unix 将在进程之间共享代码页。通常没有理由不使用
    libc
    版本

    对于
    libc
    和系统调用之间的区别,其他答案已经做了出色的工作