Основы операционных систем. Практикум

       

Системные вызовы и библиотека libc


Основной постоянно функционирующей частью операционной системы UNIX является ее ядро. Другие программы (системные или пользовательские) могут общаться с ядром посредством системных вызовов, которые по сути дела являются прямыми точками входа программ в ядро. При исполнении системного вызова программа пользователя временно переходит в привилегированный режим, получая доступ к данным или устройствам, которые недоступны при работе в режиме пользователя.

Реальные машинные команды, необходимые для активизации системных вызовов, естественно, отличаются от машины к машине, наряду со способом передачи параметров и результатов между вызывающей программой и ядром. Однако с точки зрения программиста на языке C использование системных вызовов ничем внешне не отличается от использования других функций стандартной ANSI библиотеки языка C, таких как функции работы со строками strlen(), strcpy() и т.д. Стандартная библиотека UNIX – libc – обеспечивает C-интерфейс к каждому системному вызову. Это приводит к тому, что системный вызов выглядит как функция на языке C для программиста. Более того, многие из уже известных вам стандартных функций, например функции для работы с файлами: fopen(), fread(), fwrite() при реализации в операционной системе UNIX будут применять различные системные вызовы. По ходу курса нам придется познакомиться с большим количеством разнообразных системных вызовов и их C-интерфейсами.

Большинство системных вызовов, возвращающих целое значение, использует значение -1 для оповещения о возникновении ошибки и значение большее или равное 0 – при нормальном завершении. Системные вызовы, возвращающие указатели, обычно для идентификации ошибочной ситуации пользуются значением NULL. Для точного определения причины ошибки C-интерфейс предоставляет глобальную переменную errno, описанную в файле <errno.h> вместе с ее возможными значениями и их краткими определениями. Заметим, что анализировать значение переменной errno необходимо сразу после возникновения ошибочной ситуации, так как успешно завершившиеся системные вызовы не изменяют ее значения. Для получения символьной информации об ошибке на стандартном выводе программы для ошибок (по умолчанию экран терминала) может применяться стандартная UNIX-функция perror().

Функция perror()

Прототип функции

#include <stdio.h> void perror(char *str);

Описание функции

Функция perror() предназначена для вывода сообщения об ошибке, соответствующего значению системной переменной errno на стандартный поток вывода ошибок. Функция печатает содержимое строки str (если параметр str не равен NULL), двоеточие, пробел и текст сообщения, соответствующий возникшей ошибке, с последующим символом перевода строки ('\n').



Содержание раздела