Главная » Программирование для UNIX » Системные вызовы UNIX

0

Данная глава посвящена самому  нижнему  уровню  взаимодействия  с операционной системой UNIX  – системным вызовам, которые служат точками входа  в ядро. Именно эти возможности предоставляет собственно операционная система; все остальное строится на этой основе.

Рассмотрим несколько основных тем.  Прежде всего, систему ввода вывода, лежащую в основе  таких библиотечных функций, как fopen и putc. Также мы продолжим обсуждение файловой системы, в частности  каталогов и  индексных дескрипторов (inode). Затем  обсудим процессы  – способы  запуска программ из  других программ. После этого поговорим о сигналах и  прерываниях: что  происходит при  нажатии клавиши DELETE и как правильно обработать это в программе.

Как  и в главе 6, многие примеры  представляют собой  полезные программы, не вошедшие в седьмую верию. Даже если  вы  не будете  использовать именно эти программы, знакомство с ними может подсказать  вам идеи для своих  собственных проектов.

Системные вызовы детально рассмотрены в man2, а в этой главе будут рассмотрены наиболее важные моменты (без претензии на полноту изложения).

Низкоуровневый ввод−вывод

Самый нижний  уровень ввода-вывода  напрямую  взаимодействует  с операционной системой. Программа читает и пишет файлы фрагментами произвольного размера. Ядро  буферизует данные в блоках, раз мер  которых определяется периферийным устройством, и устанавливает очередность работы устройств, оптимизируя производительность для всех пользователей.

Дескрипторы файлов

Весь ввод и вывод  выполняется как чтение и запись файлов, поскольку все периферийные устройства, включая и терминал, представлены в файловой системе файлами. Это значит, что единый интерфейс управляет всем взаимодействием между программой и периферийными устройствами.

В самом  общем  случае перед  тем как читать или писать файл, необхо димо  сообщить системе о  своем  намерении; этот  процесс называется открытием файла. Если вы собираетесь записывать в файл, возможно, его надо предварительно создать. Система проверяет права пользователя на выполнение операции (существует ли файл? есть ли разрешение  на  доступ  к нему?) и, если  все  в порядке,  возвращает неотрицательное целое  число, которое и называется дескриптором файла. Всякий   раз, когда выполняется файловый  ввод-вывод,  дескриптор используется вместо имени для идентификации файла. Вся информация об открытом файле поддерживается системой, а программа обращается к нему  только по дескриптору. Указатель типа  FILE, как рассказывалось в главе 6, указывает на  структуру, которая кроме прочего содержит  дескриптор файла,  а   макрос  fileno(fp),   определенный в

<stdio.h>, возвращает этот дескриптор.

Существуют специальные соглашения,  позволяющие сделать терминальный  ввод-вывод  более  удобным.  Программа,  будучи  запущена оболочкой, получает от нее три открытых файла с дескрипторами 0, 1 и 2, которые называются стандартным вводом, стандартным выводом и стандартным выводом ошибок. Все они по умолчанию связаны с терминалом, так что если программа ограничивается чтением файла с дескриптором 0 и записью в файлы с дескрипторами 1 и 2, ей не нужно открывать файлы для ввода-вывода.  Если  же  программа открывает иные  файлы, то они получат дескрипторы 3, 4 и т. д.

Если  используется перенаправление ввода-вывода, то оболочка изме няет установленное по умолчанию соответствие для дескрипторов 0 и 1 с терминала на указанные файлы. Обычно  файловый дескриптор 2 остается связанным с терминалом, чтобы  на него могли выводиться сообщения об ошибках. Такие команды, как 2>имя5файла  и 2>&1, вызовут  переопределение умолчаний, причем переназначение файлов выполняется оболочкой, а не программой. (При  желании программа может  сама совершить переназначение, но это встречается редко.)

Источник: Керниган Б., Пайк Р., UNIX. Программное окружение. – Пер. с англ. – СПб: Символ-Плюс, 2003. – 416 с., ил.

По теме:

  • Комментарии