Какая разница между "системными вызовами" и "библиотечными подпрограммами"?
В manpages имеется несколько разделов. Два из них:
2 Unix and C system calls
3 C Library routines for C programs
Например, есть getmntinfo(3)
и getfsstat(2)
, оба выглядят так, как будто они делают то же самое. Когда следует использовать что и в чем разница?
Ответы
Ответ 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
и системными вызовами.