Как правило, вы всегда должны использовать версию библиотеки 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
и системными вызовами.