В чем разница между вызовом библиотеки и системным вызовом в Linux?

13

Я хотел бы знать, в чем разница между вызовом библиотеки и системным вызовом в Linux. Будем весьма благодарны за любые указания на хорошее понимание концепций обоих.

сен
источник

Ответы:

9

На самом деле не существует такого понятия, как «библиотечный вызов». Вы можете вызвать функцию, которая связана с общей библиотекой. И это просто означает, что путь к библиотеке ищется во время выполнения, чтобы определить местоположение вызываемой функции.

Системные вызовы - это вызовы ядра низкого уровня, обрабатываемые ядром.

Falmarri
источник
Поэтому, если кто-то задаст вышеуказанный вопрос, я могу интерпретировать его как разницу между системным вызовом и вызовом функции.
Sen
"man ltrace" выдает мой "библиотечный трассировщик вызовов" :)
ysdx
8

Если вы наберете man manв своей оболочке, вы увидите список разделов руководства

2 Системные вызовы (функции, предоставляемые ядром)

3 Библиотечные вызовы (функции внутри программных библиотек)

Например, вы найдете chmodв разделе 2 руководства при вводе man chmod. И fprintfв разделе 3.

uloBasEI
источник
3

Системные вызовы обрабатываются непосредственно ядром.

Вызовы библиотеки обрабатываются динамической (или статически связанной) библиотекой. Программа, выполняющая вызов библиотеки, должна сначала импортировать эту библиотеку, прежде чем вызов будет работать. Сами библиотечные вызовы могут использовать системные вызовы.

Иногда библиотеки предоставляются как «внешние интерфейсы» для системных вызовов, чтобы обеспечить дополнительную функциональность или простоту использования, не предоставляемую ядром.

LawrenceC
источник
Вызовы библиотеки не обязательно обрабатываются динамической библиотекой. Библиотеки могут быть статически связаны, поэтому импорт (загрузка) не требуется.
Jlliagre
Правда. Я добавил эту информацию.
LawrenceC
Только половина этого ...
Jlliagre
не должен функционировать только в файле head и быть частью библиотечных вызовов?
力 力
1

Системные вызовы - это функции, которые операционная система предоставляет приложениям для использования. Принимая во внимание, что такие функции, как в math.h, string.h и т. Д., Не имеют ничего общего с взаимодействием с операционной системой.

yasouser
источник
1

В основном есть два режима ядра Linux, а именно.

  1. Пользовательский режим,
  2. Режим ядра.

Любое ядро ​​Linux переключается между этими двумя режимами. Обычно вызовы библиотеки выполняются в режиме пользователя, а системные вызовы выполняются в режиме ядра . С точки зрения операционной системы, режим ядра является атомарным по своей природе и находится в режиме супервизора. Почти все библиотечные вызовы нуждаются в помощи ядра для выполнения своих задач. Каждый библиотечный вызов, в свою очередь, вызывает основной системный вызов. Давайте сделаем идею более понятной, используя следующий пример

  1. fopen (): это библиотечный вызов,
  2. open (): системный вызов.

Всякий раз, когда в программе c, вы используете fopen () из заголовочного файла. Среда программирования вызывает системный вызов open () из ядра и выполняет задачу открытия файла. Снова после выполнения поток управления возвращается в режим пользователя.

Для иллюстрации этого выполните следующие задачи

  1. man man: здесь вы найдете раздел руководства с 1 по 8, каждый из которых имеет определенное назначение.
  2. Do man fopen: вы увидите respose как FOPEN(3), здесь 3 обозначают ручной раздел 3 справочных страниц, который является разделом вызовов c-библиотеки.
  3. Do man open: вы увидите respose как OPEN(2), здесь 2 обозначают ручной раздел 2 справочных страниц, который является разделом системных вызовов.

    Надеюсь, вы поняли концепцию.

alpha9eek
источник
Ядро имеет только один режим, режим ядра. Пользовательские процессы имеют два рабочих режима, которые они переключают назад и вперед, пользовательский режим и ядро.
Jlliagre
1

Просто добавлю к различиям, упомянутым здесь в других ответах.

Поскольку вызов библиотеки - это просто вызов функции, переключение с пространства пользователя на пространство ядра не происходит. С другой стороны, системный вызов приводит к переключению из пространства пользователя в пространство ядра, поскольку системный вызов работает в режиме ядра.

cout_display_name
источник