- •Утилита make
- •Запуск утилиты make
- •Описание правил
- •Синтаксис правила
- •Интерфейсы прикладного программирования unix и posix
- •. Интерфейсы прикладного программирования posix
- •Общие характеристики интерфейсов прикладного программирования
- •Системные функции управления состоянием процесса
- •Int main()
- •Int main()
- •Сигналы
- •Назначение и основные сведения
- •Типы и имена сигналов
- •Void(*signal(int sig, void(*func)(int)))(int);
- •Int sigaction(int sig, const struct sigaction *act, struct sigaction *oact);
- •Int main( int argc, char** argv)
. Интерфейсы прикладного программирования posix
Большинство API, определенных в стандартах POSIX. 1 иPOSIX.lb, соответствуютAPIОСUNIX. Тем не менее, комитеты POSIX все же разрабатывают собственныеAPI, когда ощущается нехваткаAPIUNIX. Например, комитет POSIX. 1Ь создает новый наборAPIдля межпроцессного взаимодействия на основе сообщений, разделяемой памяти и семафоров. Аналогичные механизмы для межпроцессного взаимодействия есть и в ОСUNIXSystemV,но последние не используют путевые имена для определения этих средств межпроцессного взаимодействия, и процессы не могут использовать их для осуществления связи по локальной сети. Поэтому комитет POSIX. 1Ь создал другую версию сообщений, разделяемой памяти и семафоров, в которой упомянутые недостатки устранены.
И все же APIPOSIXиспользуются и ведут себя аналогичноAPIUNIX. Однако пользователи должны определять _POSIX_SOURCE(дляAPIPOSIX.1)и (или) _POSIX_C_SOURCE(дляAPIPOSIX. 1 и POSIX. 1Ь) в своих программах, чтобы обеспечить объявлениеAPIPOSIXв файлах заголовков, указанных в этих программах.
5.2. Среда разработки UNIXи POSIX
В файле заголовков <unistd.h> объявляются некоторые широко используемыеAPIPOSIX.1 иUNIX. Имеется также набор относящихся кAPIзаголовков, размещенных в каталоге <sys> (в UNIX-системе это каталог/usr/include/sys).Заголовки типа <sys/...> объявляют специальные типы данных для объектов данных, которыми манипулируют иAPI, и пользовательские процессы. Кроме того, заголовок <stdio.h> объявляет функциюperror, которая может быть вызвана процессом пользователя всякий раз, когда выполнениеAPIзавершается неудачей. Функцияperrorобеспечивает выводна экран определенного системой диагностического сообщения для любого отказа, вызванногоAPI.
Большая часть объектного кода APIPOSIX.l,POSIX.lbиUNIXнаходится в библиотекахlibc.aиlibc.so.Таким образом, не нужно определять никаких специальных ключей компилятора, чтобы указать, в каком архиве или совместно используемой библиотеке хранится объектный кодAPI. В некоторых системах, однако, объектный код определенных сетевых коммуникационныхAPIнаходится в специальных библиотеках (например, в ОСSolaris2.XфирмыSunMicrosystemsAPIгнезд (sockets) хранятся в библиотекахlibsocket.aиlibsocket.so).Поэтому пользователи должны обращаться к руководству системного программиста за информацией о специальных заголовках и библиотеках, необходимых дляAPI, которые они используют.
Общие характеристики интерфейсов прикладного программирования
Хотя APIPOSIXиUNIXвыполняют от лица пользователей разнообразные системные функции, большинство из них возвращает целое число, значение которого свидетельствует о корректности завершения выполнения. В частности, еслиAPIвозвращает -1, это значит, что попытка выполнитьAPIпотерпела неудачу и глобальной переменнойеrrпо(которая объявлена в заголовке <errno.h>) присваивается код ошибки. Пользовательский процесс может вызывать функциюperror,чтобы направить диагностическое сообщение об отказе на стандартный вывод, или функциюstrerror,задав ей в качестве аргумента значениеerrno.Функцияstrerrorвозвращает строку диагностического сообщения, и пользовательский процесс может вывести это сообщение так, как он считает нужным (например, поместить его в файл регистрации ошибок).
Коды ошибок, которые могут быть присвоены errnoлюбымAPI, определены в файле заголовков <errno.h>. Когда пользователь просматривает man-страницуAPI, на ней, как правило, перечисляются возможные коды ошибок, которые присваиваютсяerrnoданнымAPI, и причины их возникновения. Так как эта информация всегда доступна пользователям, а коды ошибок в различных системах могут быть разными, в этой книге не будут подробно описываться значенияerrnoдля отдельныхAPI. Ниже приведен список наиболее распространенных кодов ошибок и их значения.
Код ошибки |
Значение |
EACCESS |
Процесс не имеет права на выполнение операции с помощьюAPI |
EPERM |
APIбыл прерван, потому что вызывающий процесс не имеет права привилегированного пользователя |
ENOENT |
Интерфейсу прикладного программирования было указано недействительное имя файла недействительным дескриптором файла |
EINTR |
Выполнение APIбыло прервано каким-то сигналом (сигналы вызываемые ими прерывания рассматриваются в главе 9) |
EAGAIN |
APIбыл прерван, потому что какой-то необходимый системный ресурс был временно недоступен. Этот APIследует вызвать позже |
ENOMEM |
APIбыл прерван потому, что ему не была выделена динамическая память |
ЕIO |
В процессе выполнения APIпроизошла ошибка ввода-вывода |
EPIPE |
APIпопытался записать данные в канал, для которого не существует читающего процесса |
EFAULT |
Интерфейсу прикладного программирования был передан недействительный адрес в одном из аргументов |
ENOEXEC |
APIне смог выполнить программу с помощью одного из системных вызовов семействаехсс |
ECHILD |
Процесс не имеет ни одного порожденного процесса, завершения которого он мог бы ждать |
Если APIвыполнен успешно, он возвращает нулевое значение или указатель на некоторую запись данных, где хранится необходимая пользователю информация.