Внутренняя работа стандартной библиотеки C

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

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

  • Standard-Library-PJ-Plauger 1991
  • FreeBSD
  • GNU человек
  • C проект (ы)

Albertus

2 ответа

Решение

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

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

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

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

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

  • 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 и напрямую в большинстве других libcs.
  • Регулярное выражение и соответствие глобуса
  • Время и часовой пояс
  • Конвертация локали и кодировки
  • Malloc

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

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

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

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

http://careferencemanual.com/

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

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

Другие вопросы по тегам