Основы программирования в Linux - Нейл Мэтью
Шрифт:
Интервал:
Закладка:
□ -Wformat — проверяет корректность типов аргументов функций семейства printf.
□ -Wparentheses — проверяет наличие скобок, даже там, где они не нужны. Эта опция очень полезна для проверки того, что сложные структуры инициализированы так, как задумано.
□ -Wswitch-default — проверяет наличие варианта default в операторах switch, что обычно считается хорошим стилем программирования.
□ -Wunused — проверяет разнообразные случаи, например, статические функции объявленные, но не описанные, неиспользуемые параметры, отброшенные результаты.
□ -Wall — включает большинство типов предупреждений gcc, в том числе все предыдущие опции -W (не охватывается только -pedantic). С ее помощью легко добиться чистоты программного кода.
ПримечаниеСуществует еще огромное множество дополнительных опций предупреждений, все подробности см. на Web-страницах gcc. В основном мы рекомендуем применять -Wall; это удачный компромисс между проверкой, обеспечивающей программный код высокого качества, и необходимостью вывода компилятором массы тривиальных предупреждений, которые становится трудно свести к нулю.
Интерфейсы и Linux Standards Base
Теперь мы собираемся подняться на уровень выше и перейти от программного кода на языке С к рассмотрению интерфейсов (системных функций), предоставляемых операционной системой. У этого уровня стандартизации есть разные составляющие: функции, предоставляемые библиотеками, и системные вызовы, реализованные операционной системой на низком уровне. И у тех, и у других есть два уровня детализации: какие интерфейсы представлены и определение того, что делает каждый интерфейс.
Определяющий документ в этой области для ОС Linux — Linux Standards Base (LSB, стандарты операционных систем на базе Linux), который можно найти на Web-сайтах http://mvw.linuxbase.org или http://www.linux-foundation.org/en/LSB. Уже выпущено несколько версий стандартов, и работа продолжается.
Список дистрибутивов, прошедших сертификацию, можно найти по адресу http://www.linux-foundation.org/en/Products. Сертифицированы разные версии Red Hat, SUSE и Ubuntu, но помните о том, что после выпуска дистрибутива до момента сертификации должно пройти некоторое время. На Web-сайте есть список дистрибутивов, проходящих тестирование или только нуждающихся в некоторых обновлениях для того, чтобы пройти сертификационные испытания.
В стандарте Linux Standards Base (что касается версии 3.1) определены три области для проверки на соответствие:
□ ядро — основные библиотеки, утилиты и местонахождение ключевых компонентов файловой системы;
□ С++ — библиотеки С++;
□ рабочий стол — дополнительные файлы для установок рабочего стола, в основном разные графические библиотеки.
В спецификации нас интересует больше всего ядро.
Стандарт LSB охватывает ряд областей в собственной документации, но для определений конкретных интерфейсов также приводит ссылки на внешние стандарты. В стандарте описаны следующие области:
□ форматы объектных файлов для двоичной совместимости;
□ стандарты динамического связывания;
□ стандартные библиотеки, как базовые, так и библиотеки X Window System;
□ командная оболочка и другие программы режима командной строки;
□ среда исполнения, включая пользователей и группы;
□ инициализация системы и уровни запуска (run levels).
В этой главе мы обсудим только стандартные библиотеки, пользователей и инициализацию системы.
Стандартные библиотеки LSB
Документация Linux Standard Base определяет двумя способами интерфейсы, которые должны присутствовать. Для некоторых функций, в основном реализованных библиотекой С проекта GNU или склонных быть стандартами только для Linux, определяются и интерфейс, и его поведение. Для других интерфейсов, в особенности с UNIX-подобной основой, стандарт просто констатирует, что такой интерфейс должен присутствовать и должен вести себя, как определено другим стандартом, обычно Common Application Environment (CAE, общая прикладная среда) или еще чаще Single UNIX Specification (единая спецификация UNIX), который есть на Web-сайте Open Group http://www.opengroup.org. Некоторые части можно найти (в настоящее время требуется регистрация) по адресу http://www.unix.org/online.html.
К сожалению, у лежащих в основе стандартов для ОС Linux и UNIX-стандартов довольно запутанное прошлое, и существует слишком широкий выбор, хотя в основном разные версии почти совместимы.
Краткий урок историиОС UNIX родилась в конце 1960 гг. в подразделении Bell Laboratories компании AT&T, когда Кен Томпсон (Ken Thompson) и Деннис Ритчи (Dennis Ritchie) написали операционную систему, первоначально предназначенную только для личного пользования, которую назвали Unics. Каким-то образом имя изменилось на UNIX. AT&T разрешила университетам брать исходный программный код для собственных разработок, и система UNIX быстро стала невероятно популярной благодаря очень четкой логической структуре и мощным идеям. Наличие исходного программного кода должно было стать существенным стимулом, т. к. позволяло программистам вносить изменения и экспериментировать.
Операционная система BSD была вариантом, который появился благодаря работе, проделанной в Университете Калифорнии в Беркли, и уделившей много внимания организации и поддержке сети.
Когда компания AT&T начала превращать UNIX в коммерческую систему, что происходило главным образом в середине 1980 гг., она называла выпуски системы UNIX System, и самым популярным был UNIX System V.
Появилось много и других вариантов, слишком много, чтобы перечислять их здесь, все они имели небольшие отличия от базовых стандартов и некоторые дополнения, поскольку компании пытались повысить стоимость продукта, создавая собственные расширения.
Все по-настоящему усложнилось, когда AT&T продала UNIX-бизнес компании Novell, которая в 1994 г. решила его завершить, и владение правами и торговыми марками стало чем-то неопределенным, послужившим предметом разных судебных разбирательств.
В 1988 г. IEEE (Institute of Electrical and Electronic Engineers, Институт инженеров по электротехнике и радиоэлектронике, http://www.ieee.org) выпустил первый набор стандартов: POSIX или IEEE 1003 — стандартов, которые задумывались как определяющая спецификация переносимого интерфейса компьютерных операционных систем. Несмотря на то, что это хороший и четко определенный стандарт, POSIX — также во многом лишь спецификация ядра с очень ограниченной областью применения.
В 1994 г. X/Open Company, не участвующая в поставках организация, выпустила более полный набор спецификаций, X/Open CAE или Common Applications Environment (общая прикладная среда), представляющий собой расширенный вариант стандартов IEEE POSIX и формально идентичный им во многих областях. Компания X/Open позже объединилась с OSF (Free Software Foundation, фонд свободного программного обеспечения) для учреждения Open Group; ее исходная Web-страница находится по адресу http://www.opengroup.org/. Стандарт CAE был исправлен и выпущен в 2002 г. как Single UNIX Specification, Version 3 (единая спецификация UNIX, версия 3), разработанный Open Group.
Именно на эту спецификацию чаще всего ссылается база стандартов Linux.
ПримечаниеСледует отметить, что "Linux" — это торговая марка, принадлежащая Линусу Торвальдсу (Linus Torvalds). См. http://www.linuxmark.org/.
Применение стандарта LSB к библиотекам
Довольно об истории создания стандартов. Что означает для людей, пишущих программы на языке С (или С++), требование их переносимости?
Во-первых, вы должны убедиться в том, что используемая вами библиотечная функция приведена в стандарте LSB. Если ее там нет, возможно, вы делаете что-то, что нелегко будет перенести в другую систему, и вам следует поискать стандартный способ реализации той задачи, которую вы пытаетесь решить. Быть может, стоит попробовать команду Linux apropos, которая ищет страницы интерактивного справочного руководства для соответствующих ссылок.
Во-вторых, что труднее, следует убедиться в том, что поведение используемой вами функции включено в стандарт, и вы не полагаетесь на поведение, не описанное в стандарте. Возможно, для этого вам придется обратиться к стандарту Single UNIX Specification, если применение функции не определено в стандарте LSB. Очень хороший способ проверки неопределенного или потенциально ошибочного поведения — обращение к интерактивному руководству Linux. На многих его страницах есть раздел "BUGS" ("Ошибки"), представляющий собой неоценимый источник информации о том, где в ОС Linux конкретный вызов не в полной мере реализует стандарты или где существуют дефекты и нелепости в поведении.
Пользователи и группы LSBЭтот раздел стандарта точен, краток и понятен. Далее перечислены некоторые требования стандарта.