Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Материалы / MAKE_posix_creprc_sem_sig.DOC
Скачиваний:
27
Добавлен:
01.05.2014
Размер:
146.94 Кб
Скачать

. Интерфейсы прикладного программирования 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выполнен успешно, он возвращает нулевое значение или указатель на некоторую запись данных, где хранится необходимая пользователю информация.

Соседние файлы в папке Материалы