在Linux中,库调用和系统调用有什么区别?


13

我想知道Linux中的库调用和系统调用之间有什么区别。很好地理解了两者背后的概念的任何指示将受到赞赏。

Answers:


9

实际上没有所谓的“图书馆电话”之类的东西。您可以调用链接到共享库的函数。这仅意味着在运行时查找库路径,以确定要调用的函数的位置。

系统调用是由内核处理的低级内核调用。


因此,如果有人问上述问题,我可以将其解释为系统调用和功能调用之间的区别。

“ man ltrace”给出了我的“ A库调用跟踪程序” :)
ysdx

8

如果键入man man外壳,您将看到手册部分的列表

2个系统调用(内核提供的功能)

3个库调用(程序库中的函数)

例如,chmod键入时,您会在手册的第2节中找到man chmod。并fprintf在第3节中


3

系统调用直接由内核处理。

库调用由动态(或静态链接)库处理。进行库调用的程序必须先导入该库,然后调用才能起作用。库调用本身可以使用系统调用。

有时,将库作为​​系统调用的“前端”提供,以提供内核未提供的额外功能或易用性。


库调用不一定由动态库处理。库可以静态链接,因此不需要导入(加载)。
jlliagre

真正。我添加了该信息。
LawrenceC

只有一半...
jlliagre

不应仅在头文件中起作用也是库调用的一部分吗?
陈力

1

系统调用是操作系统提供给应用程序使用的功能。而与math.h,string.h等中的函数一样,这些函数与与操作系统的接口无关。


1

基本上,Linux内核有两种模式。

  1. 用户模式
  2. 内核模式。

任何Linux内核都会在这两种模式之间来回切换。通常,库调用用户模式下执行,而系统调用内核模式下执行。用操作系统的术语来说,内核模式本质上是原子的,而在监督模式下则是原子的 几乎所有库调用都需要内核的帮助才能执行其任务。每个库调用依次调用基础系统调用。让我们用下面的例子使想法更清晰

  1. fopen():是一个库调用,
  2. open():是一个系统调用。

每当在c程序中,都可以从头文件中使用fopen()。编程环境从内核调用系统调用open()并执行其文件打开任务。执行后,控制流程再次返回用户模式。

为了说明这一点,请执行以下任务

  1. man man:在这里您将找到1-8的手册部分,每个部分都有特定的用途。
  2. 要做man fopen:您将看到respose为FOPEN(3),这里3表示手册页的手册第3节,它是c库调用部分。
  3. man open:您将看到respose为OPEN(2),这里2表示手册页的手册第2节,即系统调用部分。

    希望您理解这个概念。


内核只有一种模式,内核模式。用户进程具有来回切换的两种操作模式:用户域和内核。
jlliagre

1

只是增加了其他答案在这里提到的差异。

由于库调用只是函数调用,因此不会发生从用户空间到内核空间的切换。另一方面,由于系统调用以内核模式运行,因此系统调用会导致从用户空间切换到内核空间。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.