系统调用和库调用的区别

2025 年 4 月 29 日 | 阅读 5 分钟

在本文中,您将学习系统调用和库调用之间的区别。但在讨论区别之前,您必须了解什么是系统调用和库调用。

什么是系统调用?

它是一种进程与操作系统(OS)通信的方法。它是一种编程方法,使计算机程序能够向操作系统的内核请求服务。系统调用通过 API(应用程序编程接口)向用户程序提供操作系统的服务。系统调用是内核系统的单入口点。

计算机系统中有两种可用模式:内核模式和用户模式。在计算机系统中,各种类型的程序或应用都在运行。在内核模式下,程序可以直接访问硬件资源和内存,这比用户模式权限更高。在用户模式下,程序无法直接访问内存和硬件资源。大多数程序在用户模式下运行。当程序需要硬件资源和内存时,它会向内核发送系统调用请求。之后,模式从用户模式切换到内核模式。当工作完成后,模式会从内核模式切换回用户模式。因此,这种模式转换也称为上下文切换。

UNIX系统中主要有两种系统调用,如下

  1. Fork()
  2. Exec()

fork()

它用于在保持现有进程运行的同时启动一个新进程。当某个特定进程调用 fork() 时,它会创建一个进程的副本。因此,会有两个进程。主进程是父进程,而第二个进程是子进程。

exec()

它用于启动一个新进程并替换旧的正在运行的进程。因此,在调用 exec() 后,只存在新进程。

什么是库调用?

它是对编程库使用某个函数的请求。库文件包含代码、数据和对象文件,它们被存储在单个文件中以供使用。在执行库调用之前必须导入库,并且库调用可能依赖于系统调用。

在C语言编程中,用户可以通过在程序中添加头文件来使用库函数。预处理器指令 (#include) 有助于添加头文件。stdio.h 头文件中包含了用于执行输入和输出操作的各种函数。如果你想打开一个文件,使用 fopen() 函数;如果你想关闭文件,使用 fclose() 函数。printf() 有助于将格式化输出传输到标准输出设备,而 scanf() 有助于从标准输入设备读取格式化输入。

此外,"math.h" 头文件也提供了执行数学计算的函数。"time.h" 头文件包含用于计算时间和日期的函数。"string.h" 头文件包含用于操作字符串的函数。

系统调用和库调用之间的主要区别

System Call vs Library Call

在这里,您将学习系统调用和库调用之间的主要区别。系统调用和库调用之间的各种区别如下

  1. 系统调用是一个内核函数,允许您进入内核模式并访问硬件资源。另一方面,库调用是编程库提供的用于完成任务的函数。
  2. 在系统调用函数中,模式从用户模式切换到内核模式。另一方面,在库调用函数中没有模式切换。
  3. 系统调用的执行时间比库调用长。另一方面,库调用的执行速度比系统调用快。
  4. 在系统调用中,所有函数都是内核的一部分。另一方面,在库调用中,所有库函数都是编程语言标准库文件的一部分。
  5. 它是程序请求在内核模式下访问进程。另一方面,库调用是程序请求访问编程库中提供的库函数。

系统调用和库调用的正面比较

在这里,您将学习系统调用和库调用之间的正面比较。系统调用和库调用之间的主要区别如下

系统调用库调用
在系统调用中,所有函数都是内核的一部分。在库调用中,所有库函数都是编程语言标准库文件的一部分。
它是内核的入口点。因此,它不与程序链接。它与您的程序链接。
系统调用的执行时间比库调用长。库调用的执行速度比系统调用快。
存在模式切换,即模式从用户模式切换到内核模式。没有模式切换。
它是一个内核函数,允许您进入内核模式并访问硬件资源。它是一个由编程库提供的用于执行任务的函数。
它在内核模式下执行。它在用户模式下执行。
它是程序请求在内核模式下访问进程。它是程序请求使用编程库中的库函数。
它不可移植。它是可移植的。
这些由系统提供并由系统内核实现。这些被添加到ANSI C标准库中。
系统调用的例子有
  1. Fork()
  2. Exec()
库调用的例子有
  1. Fopen()
  2. Fclose()
  3. Printf()
  4. Scanf()

结论

系统调用在内核空间执行,而库调用在用户空间执行。库调用是编程库提供的函数。相比之下,系统调用是一个内核函数,允许您进入内核模式并访问硬件资源。库调用可能依赖于系统调用来完成任务。系统调用的一些例子是 cd()、fork()。库调用的一些例子是 fopen()、fprintf()