Подтвердить что ты не робот

Какая разница между "системными вызовами" и "библиотечными подпрограммами"?

В manpages имеется несколько разделов. Два из них:

2     Unix and C system calls
3     C Library routines for C programs

Например, есть getmntinfo(3) и getfsstat(2), оба выглядят так, как будто они делают то же самое. Когда следует использовать что и в чем разница?

4b9b3361

Ответ 1

Системные вызовы - это функции операционной системы, например, в UNIX, функция malloc() построена поверх sbrk() (для изменения размера пространства памяти процесса).

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

Линия может быть немного размытой, но просто просматривать системные вызовы как функциональные возможности уровня ядра.

Ответ 2

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

Что касается использования, как правило, используйте тот, который наилучшим образом соответствует вашим потребностям.

Ответ 3

Библиотеки общих функций строятся поверх интерфейса системного вызова, но приложения могут использовать оба.

Системные вызовы похожи на ключи аутентификации, которые имеют доступ к ресурсам ядра.

enter image description here

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

Ответ 4

Вызовы, описанные в разделе 2 руководства, являются относительно тонкими обертками вокруг фактических вызовов системным службам, которые ловутся к ядру. Стандартные библиотечные процедуры C, описанные в разделе 3 руководства, являются библиотечными функциями на стороне клиента, которые могут или не могут фактически использовать системные вызовы.

Эта публикация содержит описание системных вызовов и ловушек для ядра (в немного другом контексте) и объясняет основной механизм системных вызовов с некоторыми ссылками.

Ответ 5

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

  • Вы хотите быть libc агностиком; Может быть, с установщиком. Такой код может работать на Android (bionic), uClibc и более традиционных систем glibc/eglibc, независимо от используемой библиотеки. Кроме того, динамическая загрузка с помощью оберток для создания слоя glibc/bionic во время выполнения, позволяющего использовать двойной Android/Linux.
  • Вам нужна максимальная производительность. Хотя это, вероятно, редко и, скорее всего, ошибочно. Вероятно, переосмысление проблемы даст лучшие преимущества в производительности, а не вызов системы часто представляет собой выигрыш в производительности, который может время от времени libc.
  • Вы пишете код initramfs или init без библиотеки; для создания меньшего изображения или загрузки быстрее.
  • Вы тестируете новое ядро ​​/платформу и не хотите усложнять жизнь полноценной файловой системой; очень похож на initramfs.
  • Вы хотите сделать что-то очень быстро при запуске программы, но в конце концов захотите использовать подпрограммы libc.
  • Чтобы избежать известной ошибки в libc.
  • Функциональность недоступна через libc.

Извините, большинство примеров являются специфичными для Linux, но рациональность должна применяться к другим вариантам Unix. Последний элемент довольно часто встречается, когда новые функции вводятся в ядро. Например, если kqueue или epoll, где сначала но не было libc для их поддержки. Это может также произойти, если в системе установлена ​​более старая библиотека, но более новое ядро, и вы хотите использовать эту функциональность.

Если ваш процесс не использовал libc, то, скорее всего, что-то в системе будет иметь. Путем кодирования ваших собственных вариантов вы можете свести на нет кеш, предоставив два пути к одной и той же конечной цели. Кроме того, Unix будут совместно использовать кодовые страницы между процессами. Как правило, нет оснований не использовать версию libc.

Другие ответы уже сделали звездную работу по разнице между libc и системными вызовами.