Книга: Разработка приложений в среде Linux. Второе издание
9.2.3. Использование системных вызовов
9.2.3. Использование системных вызовов
Интерфейс, с которым вам, как программисту, возможно, доведется работать, представляет собой набор оболочек библиотеки С для системных вызовов. В оставшейся части этой книги под системным вызовом будет подразумеваться функция оболочки С, которая используется для реализации системного вызова, а не тот неуклюжий интерфейс, который скрывает библиотека С.
Большинство, но не все, системные вызовы объявлены в <unistd.h>
. Фактически файл <unistd.h>
представляет собой универсальное вместилище практически для всех системных вызовов. Чтобы определить, какие включаемые файлы нужно использовать, обычно нужно обратиться к системным man-страницам. Хотя описания функций на man-страницах зачастую весьма лаконичны, там можно найти точные указания о том, какой файл должен быть включен для использования функции.
Есть одна особенность, свойственная системам Unix. Системные вызовы документированы в отдельном разделе man-страниц для библиотечных функций, и вы будете использовать библиотечные функции для доступа к системным вызовам. Там, где библиотечные функции отличаются от системных вызовов, предусмотрены отдельные man- страницы. Это не вызывало бы проблем, однако практически всегда требуется читать страницу, описывающую библиотечную функцию, номер которой больше номера страницы с описанием соответствующего системного вызова. Ввиду того, что man-страницы выводятся, начиная с меньших номеров, приходится проделывать лишнюю работу.
Простого указания номера раздела недостаточно. Системные вызовы, которые помещены в минимальные функции-оболочки из библиотеки С, не документированы как часть библиотеки, следовательно команда man 3 функция
не найдет их. Для того чтобы убедиться, что вы прочли всю необходимую для вас информацию, вначале взгляните на man-страницу, не указывая раздел. Если это раздел 2 на man-странице, посмотрите, есть ли там раздел 3 с таким же именем. Если открывается раздел 1 man-страницы, как это часто случается, внимательно просмотрите разделы 2 и 3.
К счастью, существует другой способ решения такой проблемы. Многие версии программы man
, включая используемую в системах Linux, позволяют указывать альтернативный путь поиска man-страниц. Прочтите man-страницу о самой программе man
, чтобы определить, поддерживается ли в вашей версии man
переменная окружения MANSECT
и аргумент -S
. Если переменная поддерживается, можно установить MANSECT
в что-нибудь вроде 3:2:1:4:5:6:7:8:tcl:n:l:p:о
. Просмотрите в файле конфигурации man
(в большинстве систем Linux это /etc/man.config
) текущую настройку MANSECT
.
Большинство системных вызовов возвращает 0
при успешном выполнении. В случае возникновения ошибки они возвращают отрицательное значение. Вследствие этого, во многих случаях, подходит простейшая форма обработки ошибок.
if (ioctl(fd, FN, data)) {
/* обработка ошибки на основе errno */
}
Часто встречается следующая форма:
if (ioctl(fd, FN, data) < 0) {
/* обработка ошибки на основе errno */
}
Для системных вызовов, которые возвращают 0
, обозначая успех, оба эти случая идентичны. В своем коде можете выбрать то, что вам больше подходит. Будьте готовы к тому, что столкнетесь с этими и другими способами обработки в чужих кодах.
- Обработка системных вызовов
- Использование системных вызовов операционной системы MS-DOS
- 9.2.1. Ограничения системных вызовов
- 26.2. Использование таблиц параметров
- 16.6. Семантика вызовов
- Оптимизация вызовов
- Восстановление с использованием инструмента gbak
- Типы страниц и их использование
- Использование констант
- Использование переменной окружения ISC_PATH
- Использование сервера Yaffil внутри процесса
- Использование CAST() с типами дата