Майкл Джонсон - Разработка приложений в среде Linux. Второе издание
- Название:Разработка приложений в среде Linux. Второе издание
- Автор:
- Жанр:
- Издательство:Вильямс
- Год:2007
- Город:Москва
- ISBN:978-5-8459-1143-8
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Майкл Джонсон - Разработка приложений в среде Linux. Второе издание краткое содержание
Книга известных профессионалов в области разработки коммерческих приложений в Linux представляет собой отличный справочник для широкого круга программистов в Linux, а также тех разработчиков на языке С, которые перешли в среду Linux из других операционных систем. Подробно рассматриваются концепции, лежащие в основе процесса создания системных приложений, а также разнообразные доступные инструменты и библиотеки. Среди рассматриваемых в книге вопросов можно выделить анализ особенностей применения лицензий GNU, использование свободно распространяемых компиляторов и библиотек, системное программирование для Linux, а также написание и отладка собственных переносимых библиотек. Изобилие хорошо документированных примеров кода помогает лучше усвоить особенности программирования в Linux.
Книга рассчитана на разработчиков разной квалификации, а также может быть полезна для студентов и преподавателей соответствующих специальностей.
Разработка приложений в среде Linux. Второе издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Время от времени вы можете застать себя на том, что просматриваете заголовочные файлы Linux. Скорее всего, вы найдете рад конструкций, не совместимых со стандартом ANSI/ISO. Некоторые из них стоят того, чтобы в них разобраться. Все конструкции, рассматриваемые в этой книге, более подробно изложены в документации по gcc
.
5.2.1. long long
Тип long long
указывает на то, что блок памяти, по крайней мере, такой же большой, как long
. На Intel i86 и других 32-разрядных платформах long
занимает 32 бита, а long long
— 64 бита. На 64-разрядных платформах указатели и long long
занимают 64 бита, a long
может занимать 32 или 64 бита в зависимости от платформы. Тип long long
поддерживается в стандарте С99 (ISO/IEC 9899:1999) и является давним расширением С, которое обеспечивается gcc
.
5.2.2. Встроенные функции
В некоторых частях заголовочных файлов Linux (в частности тех, что специфичны для конкретной системы) встроенные функции используются очень широко. Они так же быстры, как и макросы (нет затрат на вызовы функции), и обеспечивают все виды проверки, которые доступны при нормальном вызове функции. Код, вызывающий встроенные функции, должен компилироваться, по крайней мере, с включенной минимальной оптимизацией ( -O
).
5.2.3. Альтернативные расширенные ключевые слова
В gcc
у каждого расширенного ключевого слова (ключевые слова, не описанные стандартом ANSI/ISO) есть две версии: само ключевое слово и ключевое слово, окруженное с двух сторон двумя символами подчеркивания. Когда компилятор применяется в стандартном режиме (обычно тогда, когда задействована опция -ansi
), обычные расширенные ключевые слова не распознаются. Так, например, ключевое слово attribute
в заголовочном файле должно быть записано как __attribute__
.
5.2.4. Атрибуты
Расширенное ключевое слово attribute
используется для передачи gcc
большего объема информации о функции, переменной или объявленном типе, чем это позволяет код С, соответствующий стандарту ANSI/ISO. Например, атрибут aligned
дает указание gcc о том, как именно выравнивать переменную или тип; атрибут packed
указывает на то, что заполнение использоваться не будет; noreturn
определяет то, что возврат из функции никогда не произойдет, что позволяет gcc
лучше оптимизироваться и избегать фиктивных предупреждений.
Атрибуты функции объявляются путем их добавления в объявление функции, например:
void die_die_die(int, char*) __attribute__ ((__noreturn__));
Объявление атрибута размещается между скобками и точкой с запятой и содержит ключевое слово attribute
, за которым следуют атрибуты в двойных круглых скобках. Если атрибутов много, следует использовать список, разделенный запятыми.
int printm(char*, ...)
__attribute__((const,
format(printf, 1, 2)));
В этом примере видно, что printm
не рассматривает никаких значений, кроме указанных, и не имеет побочных эффектов, относящихся к генерации кода ( const
), printm указывает на то, что gcc
должен проверять аргументы функции так же, как и аргументы printf()
. Первый аргумент является форматирующей строкой, а второй — первым параметром замены ( format
).
Некоторые атрибуты будут рассматриваться по мере дальнейшего изложения материала (например, во время описания сборки совместно используемых библиотек в главе 8). Исчерпывающую информацию по атрибутам можно найти в документации gcc
в формате Texinfo.
Глава 6
Библиотека GNU C
Библиотека GNU С ( glibc
) — это стандартная библиотека языка С, разработанная для Linux-систем. Существуют и другие библиотеки С, которые иногда используются в определенных целях (например, очень маленькое подмножество стандартных библиотек С применяется во встроенных системах и для начальной загрузки). Но во всех дистрибутивах Linux стандартной библиотекой языка С, предоставляющей значимый объем функциональности, является glibc
. Именно эта библиотека и описывается в настоящей книге.
6.1. Выбор возможностей glibc
В glibc
существует набор макросов для выбора возможностей. Эти макросы используются для выбора стандарта, которому будет подчиняться glibc
. Иногда стандарты конфликтуют между собой, a glibc
позволяет выбирать именно тот набор стандартов (формальный, де-юре , и неформальный, де-факто ), которым нужно соответствовать полностью либо частично. Технически такие макросы называются макросами проверки возможностей .
Знание этих макросов необходимо, так как набор макросов, определенных по умолчанию, не обеспечивает полную функциональность glibc
. Некоторые механизмы, описанные в этой книге, в выбранном по умолчанию наборе функций не доступны; далее мы опишем макросы, необходимые для включения каждого такого механизма.
Макросы проверки возможностей разработаны для определения стандартов ( де-юре или де-факто ), и в некоторых случаях они определяют, каким именно версиям этих стандартов должна соответствовать glibc
. Это соглашение часто не включает определения функций и макросов, не указанных стандартом, в стандартных заголовочных файлах. Это значит, что приложение, написанное в соответствии со стандартом, может определять свои собственные функции и макросы, не конфликтуя с расширениями, которые этим стандартом не определены.
Макросы проверки возможностей не гарантируют того, что приложение будет полностью совместимо со стандартами, определяемыми набором макросов. Настройка макроса проверки возможности может обнаружить использование непереносимых расширений, но при этом не будет обнаружено использование, скажем, заголовочных файлов, которые полностью не определены стандартом.
Макросы определяются в системном заголовочном файле feature.h
, который не должен включаться непосредственно. Взамен его включают все другие заголовочные файлы, которые зависят от содержимого feature.h
.
Набор макросов по умолчанию содержит _SVID_SOURCE=1
, _BSD_SOURCE=1
, _POSIX_SOURCE=1
и _POSIX_C_SOURCE=199506L
. Описание каждой из этих опций можно найти ниже, но все это, по сути, транслируется в поддержку возможностей стандарта 1995 POSIX (этот стандарт использовался до объединения стандартов POSIX и Single Unix), всех стандартных функций System V и всех функций BSD, которые не конфликтуют с функциями System V. Данного набора макросов достаточно для большинства программ.
При определении в gcc
опции -ansi
, как было описано ранее, автоматически определяется внутренний макрос __STRICT_ANSI__
, который отключает все макросы, определенные по умолчанию.
За исключением __STRICT_ANSI__
, который представляет собой специальный макрос (и должен настраиваться только компилятором в контексте опции командной строки -ansi
), эти макросы имеют накопительный характер, то есть можно определять любые их комбинации. Точное определение изменений _BSD_SOURCE
зависит от настройки других макросов (более детально об этом — ниже); все остальные
макросы — исключительно накопительные.
Интервал:
Закладка: