Внутренняя работа стандартной библиотеки C - PullRequest
7 голосов
/ 02 апреля 2012

Я заинтересован во внутренней работе стандартной библиотеки C. Я нашел хорошую книгу о возможной реализации - но я ищу более глубокое объяснение всей стандартной библиотеки и стандартов (например, POSIX) - определение этих стандартов в стандартной библиотеке.

Черновики C очень полезны, но их не очень приятно читать. Есть ли другая литература на эту тему?

  • Standard-Library-P-J-Plauger 1991
  • FreeBSD
  • GNU man
  • C осадка (и)

Albertus

Ответы [ 2 ]

6 голосов
/ 03 апреля 2012

Хорошей отправной точкой будет POSIX.Спецификация POSIX 2008 доступна здесь:

http://pubs.opengroup.org/onlinepubs/9699919799/

Она более доступна (но иногда менее строга), чем стандарт C, и охватывает гораздо больше, чем просто стандарт C, т.е.большинство стандартизированных частей стандартных библиотек Unix-подобных систем.

Если вы заинтересованы в реализациях, первое, что нужно знать, это то, что поведение, описанное в POSIX, обычно разделяется (по необходимости и прагматично).причины) между реализацией ядра и реализацией libc пользовательского пространства.Большое количество функций в POSIX (и несколько из стандарта C) будут просто обертками для «системных вызовов», то есть переходов в пространство ядра для обслуживания запроса.В некоторых реализациях libc даже найти эти обертки будет сложно, поскольку они часто либо автоматически генерируются скриптами сборки, и / или объединяются в один файл на языке ассемблера.

Major (значительное количествоподсистемы неядерного кода) стандартной библиотеки, как правило:

  • stdio: в glibc это реализуется библиотекой GNU libio, которая представляет собой унифицированную реализацию C stdio и C ++ iostream, оптимизированную такчто ни один из них не должен замедляться, будучи оберткой для другого.Это большой взлом, и код трудно найти и следовать.Другие реализации (особенно BSD, но также и другие libcs ​​в Linux) намного проще и понятнее для чтения.В конечном счете они основаны на базовых функциях ввода-вывода файлового дескриптора, таких как open, read и т. Д.
  • Потоки POSIX: в glibc и современных uClibc это NPTL.Я не знаком с реализациями потоков BSD.В других библиотеках Linux либо отсутствуют потоки, либо они предоставляют свои собственные реализации, основанные главным образом на системных вызовах Linux clone и futex.
  • Математическая библиотека: в конечном счете, почти все они основаны на старом математическом коде Sun, появившемся в начале90-е, но они сильно разошлись.Fdlibm - довольно хорошее базовое приближение кода, используемого в современных библиотеках.
  • Поиск пользователя, группы, имени хоста (DNS) и т. Д.: Это выполняется через libnss в glibc и непосредственно в большинстве других библиотек.
  • Регулярное выражение и сопоставление глобуса
  • Обработка времени и часового пояса
  • Перевод языка и набора символов
  • Malloc

Если вы хотитеНачните читать источники, я бы рекомендовал не начинать с glibc.Это очень большой и громоздкий.Если вы действительно хотите читать glibc, имейте в виду, что большая часть кода скрывается под деревьями sysdeps и организована на основе разнообразия систем, к которым она применима.

Dietlibc вполне читабелен, но если вы читаете егоисточник, имейте в виду, что он полон типичных ошибок программирования на C (например, при использовании int, где требуется size_t, без проверки на переполнение и т. д.).Если вы помните об этом, это не может быть плохим выбором, поскольку игнорирование множества возможных ошибок / сбоев приводит к тому, что код становится очень простым.

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

5 голосов
/ 02 апреля 2012

В "C: Справочное руководство, пятое издание" Harbison & Steele вторая часть книги посвящена стандартной библиотеке C (часть 2: главы 10-24).

http://careferencemanual.com

Документ Rationale для C99 не охватывает библиотеку C, но обоснование ANSI C89 охватывает его главу 4. Здесь есть копия документа:

http://www.lysator.liu.se/c/rat/title.html

...