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

в manpages есть несколько разделов. Двое из них:--4-->

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

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

5 ответов


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

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

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


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

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


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

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

enter image description here

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


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

данное сообщение имеет описание системных вызовов и захвата ядра (в несколько ином контексте) и объясняет базовый механизм системы звонки с некоторыми ссылками.


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

  1. ты хочешь быть libc агностик; возможно, с установщиком. Такой код может работать на Андроиде (bionic), uClibc и более традиционные системы glibc/eglibc, независимо от используемой библиотеки. Кроме того, динамическая загрузка с обертками, чтобы сделать время выполнения glibc / бионический слой, позволяющий двойной двоичный файл Android / Linux.
  2. вам нужна экстремальная производительность. Хотя это, вероятно, редкость и, скорее всего, заблуждение. Вероятно, переосмысление проблемы даст лучшие преимущества производительности и не вызов системы часто является выигрышем производительности, который libc can время от времени делать.
  3. вы пишете некоторых initramfs или init код без библиотеки; для создания меньшего изображения или загрузки быстрее.
  4. вы тестируете новое ядро / платформу и не хотите усложнять жизнь полномасштабной файловой системой; очень похоже на initramfs.
  5. вы хотите сделать что-то очень быстро при запуске программы, но в конечном итоге хотите использовать libc процедуры.
  6. чтобы избежать известной ошибки в libc.
  7. в функциональность недоступна через libc.

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

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

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