А. Робачевский - Операционная система UNIX (1114671), страница 21
Текст из файла (страница 21)
Можно сказать уверенно, что синтаксис языка опреде!ляется не операционной системой. Все, что вам потребуется, это хорошеезнание самого языка и особенностей системы UNIX, а именно — ее сис!темных вызовов.Несмотря на то, что многие современные версии UNIX (особенно коммерческие) постав!ляются без исходных текстов, основная часть кода ядра в них полученакомпиляцииС!модулей.www.books-shop.comпрограммы101Во!первых, не забудьте включить в исходный текст необходимые файлызаголовков. Во!вторых, уточните синтаксис вызова библиотечных и сис!темных функций. В!третьих, используйте их по назначению.
В!четвертых,не пренебрегайте комментариями.В этом (за исключением, пожалуй, четвертого совета) вам помогут элек!тронный справочникваш опыт, и, надеюсь, эта книга.ЗаголовкиИспользование системных функций обычно требует включения в текстпрограммы файловсодержащих определения— чис!ло передаваемых аргументов, типы аргументов и возвращаемого значения.Большинство системных файлов заголовков расположены в каталогахилиЕсли вы планируете использовать мало!знакомую системную функцию, будет нелишним изучить соответствующийраздел электронного справочника тап(1).
Там же, помимо описания фор!мата функции, возвращаемого значения и особых ситуаций, вы найдетеуказание, какие файлы заголовков следует включить в программу.Файлы заголовков включаются в программу с помощью директивы#include. При этом, если имя файла заключено в угловые скобки (<>), этоозначает, что поиск файла будет производиться в общепринятых каталогаххранения файлов заголовков.
Если же имя файла заголовка заключено вкавычки, то используется явно указанное абсолютное или относительноеимя файла.Например, системный вызов creat(2) служащий для создания обычногофайла, объявлен в файле <fcntl.h> следующим образом:lincludettinclude <sys/stat.h><fcntl.h>intcharВключение в исходный текст прототипа системного вызова creat(2) позво!ляет компилятору произвести дополнительную проверку правильности ис!пользования этой функции, а именно — числа аргументов и их типов.Можно заметить, что наряду со стандартными типами языка С, напримерchar, для второго аргументаиспользуется производный тип —В ранних версиях UNIX большинство системных вызовов исполь!зовали стандартные типы, например, creat(2) для второго аргумента охотнопринимала тип int.
Производные типы переменных, имеющие окончание_t, которые вы в большом количестве встретите при программировании вUNIX, получили название примитивов системных данных. Большинствоэтих типов определены в файле <sys/types.h>, а их назначение заключает!ся в улучшении переносимости написанных программ. Вместо конкретныхтипов данных, каковыми являются int, char и т. п., приложению предлага!www.books-shop.comГлава 2.102UNIXется набор системных типов, гарантированно неизменных в контексте сис!темных вызовов. Другими словами, во всех версиях UNIX сегодня и спустядесять лет, системный вызов creat(2) в качестве второго аргумента будетпринимать переменную типа mode_t.
Фактический размер переменныхэтого типа может быть разным для различных версий системы, но это от!разится в изменении соответствующего файла заголовков и потребуеттолько перекомпиляции вашей программы.Среда программирования UNIX определяется несколькими стандартами,обсуждавшимися во введении, и может незначительно различаться дляразных версий системы. В частности, стандарты ANSI С, POSIX. 1 и XPG4,определяют названия и назначения файлов заголовков, приведенныхв табл. 2.2.Таблица 2.2. Стандартные файлы заголовковФайл заголовкаНазначениеСодержит прототип функциидиагностикииспользуемой для<cpio.h>Содержит определения, используемые для файловых архи%вов cpio(1)Содержит определения символьных типов, а также прототи%пы функций определения классов символов (ASCII, печат%ные, цифровые и т.
д.) —isdigit(3C) и<dirent.h>Содержит определения структур данных каталога, а такжепрототипы функций работы с каталогамии т. д.Содержит определения кодов ошибок (см. раздел "Обра%ботка ошибок" в начале главы)<errno.h><fcntl.h>Содержит прототипы системных вызововopen(2) иcreat(2), а также определения констант и структур данных,необходимых при работе с файламиСодержит определения констант, необходимых для опера%ций с плавающей точкой<ftw.h>Содержит прототипы функций, используемых для сканиро%вания дерева файловой системы (file tree walk) ftw(3C) иnftw(3C), a также определения используемых констант<grp.h>Содержит прототипы функций и определения структур дан%ных, используемых для работы с группами пользователей:getgrnam(3C),getgrgid(3C) и т.
д.Содержит определения языковых констант: дни недели,названия месяцев и т. д., а также прототип функции<langinfo.h>www.books-shop.comпрограммыЮЗТаблица 2.2 (продолжение)ФайлНазначение<limits.h>Содержит определения констант, определяющих значенияограничений для данной реализации: минимальные и мак%симальные значения основных типов данных, максимальноезначение файловых связей, максимальная длина именифайла и т. д.<locale.h>Содержит определения констант, используемых для созда%ния пользовательской среды, зависящей от языковых икультурных традиций (форматы дат, денежные форматы ит. д.), а также прототип функции setlocale(3C)<math.h>Содержит определения математических констант (я, е,иСодержит определения для каталогов сообщений (messagecatalog), а также прототипы функций catopen(3C) иcatclose(3C)Содержит определениеструктурыфайлапаролей/etc/passwd, а также прототипы функций работы с ним:getpwnam(3C), getpwent(3C),и т.
д.<regex.h>Содержит определения констант и структур данных, исполь%зуемых в регулярных выражениях, а также прототипы функ%ций для работы с ними:и т. д.<search.h>Содержит определения констант и структур данных, а такжепрототипы функций, необходимых для поиска: hsearch(3C),hcreate(3C),Содержит прототипы функций перехода setjmp(3C),siglongjmp(3C), a также опреде%ления связанных с ними структур данных<setjmp.h><signal.h><stdarg.h>Содержит определения констант и прототипы функций, не%обходимых для работы с сигналами:sigemptyset(3C),и т. д. (см.
раздел "Сигналы"далее в этой главе)Содержит определения, необходимые для поддержки спи%сков аргументов переменной длины<stddef.h>Содержит стандартные определения (например size_t)<stdio.h>Содержит определения<stdlib.h>Содержит определения стандартной библиотеки<string.h>Содержит прототипы функций работы со строкамиstring(3C), strcasecmp(3C), strcat(3C), strcpy(3C) и т. д.<tar.h>Содержит определения, используемые для файловых архи%вов tar(1)стандартнойбиблиотекивво%www.books-shop.comГлава 2.704программирования UNIXТаблица 2.2 (продолжение)Файл заголовкаНазначение<termios.h>Содержит определения констант, структур данных и прото%типы функций для обработки терминального<time.h>Содержит определения типов, констант и прототипы функ%ций для работы со временем и датами: time(2), ctime(3C),localtime(3C), tzset(3C), а также определения, относящиесяк таймерам getitimer(2), setitimer(2).
Таймеры будут рас%смотрены в главе 3<ulimit.h>Содержит определения констант и прототип системноговызова ulimit(2) для управления ограничениями, наклады%ваемыми на процесс. См. также раздел "Ограничения" да%лее в этой главе<unistd.h>Содержит определения системных символьных констант, атакже прототипы большинства системных вызовов<utime.h>Содержит определения структур данных и прототип систем%ного вызова utime(2) для работы с временными характери%стиками файла (временем доступа и модификации)<sys/ipc.h>Содержит определения, относящиеся к системе межпро%цессного взаимодействия (IPC), которые рассматриваются вглаве 3<sys/msg.h>Содержит определения, относящиеся к (сообщениям) под%системе IPC. См.
также раздел "Сообщения" главы 3<sys/resource.h>Содержит определения констант и прототипы системныхвызовов управления размерами ресурсов, доступных про%цессу: getrlimit(2) и setrlimit(2). Более подробно ограниченияна ресурсы обсуждаются в разделе "Ограничения" далее вэтой главе<sys/sem.h>Содержит определения, относящиеся к (семафорам) под%системе IPC. См. также раздел "Семафоры" главы 3<sys/shm.h>Содержит определения, относящиеся к (разделяемой памя%ти) подсистеме IPC. См. также раздел "Разделяемая па%мять" главы 3<sys/stat.h>Содержит определения структур данных и прототипы сис%темных вызовов, необходимых для получения информациио файле: stat(2), lstat(2),Подробнее эти системныевызовы рассмотрены в разделе "Метаданные файла" далеев этой главе<sys/times.h>Содержит определения структур данных и прототипа сис%темного вызова times(2), служащего для получения стати%стики выполнения процесса (времени выполнения в режимеядра, задачи и т.
д.)<sys/types.h>Содержит определения примитивов системных данныхwww.books-shop.com105программыТаблица 2.2 (окончание)Файл заголовкаНазначение<sys/utsname.h>Содержит определения структур данных и прототип систем%ного вызоваиспользуемого для получения именсистемы (компьютера, операционной системы, версии ит.д.)Содержит определения констант и прототипы системныхвызововиспользуемых для синхрониза%ции выполнения родственных процессов<sys/wait.h>КомпиляцияПроцедура создания большинства приложений является общей и приведе!на на рис.
2.2.Рис. 2.2. Схема компиляции программыwww.books-shop.com2.программирования UNIXПервой фазой является стадия компиляции, когда файлы с исходнымитекстами программы, включая файлы заголовков, обрабатываются компи!лятором сс(1). Параметры компиляции задаются либо с помощью файла(или Makefile), либо явным указанием необходимых опций ком!пилятора в командной строке. В итоге компилятор создает набор проме!жуточных объектных файлов. Традиционно имена созданных объектныхфайлов имеют суффиксНа следующей стадии эти файлы с помощью редактора связейсвязы!ваются друг с другом и с различными библиотеками, включая стандартнуюбиблиотеку по умолчанию и библиотеки, указанные пользователем в каче!стве параметров. При этом редактор связей может выполняться в двух ре!жимах: статическом и динамическом, что задается соответствующими оп!циями.