Андрей Робачевский - Операционная система UNIX
- Название:Операционная система UNIX
- Автор:
- Жанр:
- Издательство:BHV - Санкт-Петербург
- Год:1997
- Город:Санкт-Петербург
- ISBN:5-7791-0057-8
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Андрей Робачевский - Операционная система UNIX краткое содержание
Книга посвящена семейству операционных систем UNIX и содержит информацию о принципах организации, идеологии и архитектуре, объединяющих различные версии этой операционной системы.
В книге рассматриваются: архитектура ядра UNIX (подсистемы ввода/вывода, управления памятью и процессами, а также файловая подсистема), программный интерфейс UNIX (системные вызовы и основные библиотечные функции), пользовательская среда (командный интерпретатор shell, основные команды и утилиты) и сетевая поддержка в UNIX (протоколов семейства TCP/IP, архитектура сетевой подсистемы, программные интерфейсы сокетов и TLI).
Для широкого круга пользователей
Операционная система UNIX - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Задача может зарегистрировать обработчики выхода (exit handler), — функции, которые вызываются после вызова exit(2) , но до окончательного завершения процесса. Эти обработчики, вызываемые по принципу LIFO (последний зарегистрированный обработчик будет вызван первым), запускаются только при "добровольном" завершении процесса. Например, при получении процессом сигнала обработчики выхода вызываться не будут. Для обработки таких ситуаций следует использовать специальные функции — обработчики сигналов (см. раздел "Сигналы" далее в этой главе).
Обработчики выхода регистрируются с помощью функции atexit(3C) :
#include
int atexit(void(*func)(void));
Функцией atexit(1) может быть зарегистрировано до 32 обработчиков.
На рис. 2.7 проиллюстрированы возможные варианты запуска и завершения программы, написанной на языке С.

Рис. 2.7. Запуск и завершение C-программы
Работа с файлами
В среде программирования UNIX существуют два основных интерфейса для файлового ввода/вывода:
1. Интерфейс системных вызовов, предлагающий системные функции низкого уровня, непосредственно взаимодействующие с ядром операционной системы.
2. Стандартная библиотека ввода/вывода, предлагающая функции буферизованного ввода/вывода.
Второй интерфейс является "надстройкой" над интерфейсом системных вызовов, предлагающей более удобный способ работы с файлами.
В следующих разделах будут рассмотрены:
□ оба интерфейса, и особенно первый, поскольку именно он представляет набор базовых услуг ядра;
□ программный интерфейс управления жесткими и символическими связями файла;
□ функции изменения владельцев файла и прав доступа;
□ метаданные файла;
□ пример программы, выводящей на экран наиболее существенную информацию о файле, подобно тому, как это делает утилита ls(1) .
Основные системные функции для работы с файлами
В табл. 2.7 приведены основные системные функции работы с файлами, являющиеся образами системных вызовов в программе С.
Функции более высокого уровня, предлагаемые стандартной библиотекой ввода/вывода, которые в конечном счете используют описанные здесь системные вызовы, рассматриваются в следующем разделе.
Таблица 2.7. Основные системные функции работы с файлами
Системная функция | Описание |
---|---|
open(2) | Служит для получения доступа на чтение и/или запись к указанному файлу. Если файл существует, он открывается, и процессу возвращается файловый дескриптор, адресующий дальнейшие операции с файлом. Если файл не существует, он может быть создан |
creat(2) | Служит для создания файла |
close(2) | Закрывает файловый дескриптор, связанный с предварительно открытым файлом |
dup(2) | Возвращает дубликат файлового дескриптора |
dup2(2) | Возвращает дубликат файлового дескриптора, но позволяет явно указать его значение |
lseek(2) | Устанавливает файловый указатель на определенное место файла. Дальнейшие операции чтения/записи будут производиться, начиная с этого смещения |
read (2) | Производит чтение указанного количества байтов из файла |
readv(2) | Производит несколько операций чтения указанного количества байтов из файла |
write(2) | Производит запись указанного количества байтов в файл |
writev(2) | Производит несколько операций записи указанного количества байтов в файл |
pipe(2) | Создает коммуникационный канал, возвращая два файловых дескриптора |
fcntl(2) | Обеспечивает интерфейс управления открытым файлом |
Кратко рассмотрим каждую из этих функций.
Функция open(2)
Открывает указанный файл для чтения или записи и имеет следующий вид:
#include
int open(const char *path, int oflag, mode_t mode);
Первый аргумент ( path
) является указателем на имя файла. Это имя может быть как абсолютным (начинающимся с корневого каталога /), так и относительным (указанным относительно текущего каталога). Аргумент oflag
указывает на режим открытия файла и представляет собой побитное объединение флагов, приведенных в табл. 2.8, с помощью операции ИЛИ. Напомним, что если права доступа к файлу не разрешают указанного режима работы с файлом, операция открытия файла будет запрещена, и функция open(2) завершится с ошибкой ( errno=EACCESS
). Аргумент mode, определяющий права доступа к файлу, используется только при создании файла (как показано в табл. 2,8, функция open(2) может использоваться и для создания файла) и рассматривается при описании функции creat(2) в разделе "Права доступа" этой главы.
Таблица 2.8. Флаги, определяющие режим открытия файла
Флаг | Описание |
---|---|
O_RDONLY | Открыть файл только для чтения |
O_WRONLY | Открыть файл только для записи |
O_RDWR | Открыть файл для чтения и записи |
O_APPEND | Производить добавление в файл, т.е. устанавливать файловый указатель на конец файла перед каждой записью в файл |
O_CREAT | Если указанный файл уже существует, этот флаг не принимается во внимание. В противном случае, создается файл, атрибуты которого установлены по умолчанию (см. разделы "Владельцы файлов" и "Права доступа к файлу" в главе 1), или с помощью аргумента mode |
O_EXCL | Если указан совместно с O_CREAT, то вызов open(2) завершится с ошибкой, если файл уже существует |
O_NOCTTY | Если указанный файл представляет собой терминал, не позволяет ему стать управляющим терминалом |
O_SYNC | Все записи в файл, а также соответствующие им изменения в метаданных файла будут сохранены на диске до возврата из вызова write(2) |
O_TRUNC | Если файл существует и является обычным файлом, его длина будет установлена равной 0 |
O_NONBLOCK | Изменяет режим выполнения операций read(2) и write(2) для этого файла на неблокируемый. При невозможности произвести запись или чтение, например, если отсутствуют данные, соответствующие вызовы завершатся с ошибкой EAGAIN |
Если операция открытия файла закончилась удачно, то будет возвращен файловый дескриптор — указатель на файл, использующийся в последующих операциях чтения, записи и т.д. Значение файлового дескриптора определяется минимальным свободным слотом в таблице дескрипторов процесса. Так, если дескрипторы 0 и 2 уже заняты (указывают на открытые файлы), вызов open(2) возвратит значение 1. Это свойство может быть использовано в коде командного интерпретатора при перенаправлении потоков ввода-вывода.
Читать дальшеИнтервал:
Закладка: