Операционная система UNIX - страница 59

стр.

F_SETLKУстановить блокирование записи файла. Структура >flock описывает блокирование, и указатель на нее передается в качестве третьего аргумента. При невозможности блокирования fcntl(2) возвращается С ошибкой >EACCESS или >EAGAIN.
F_SETLKWАналогично предыдущему, но при невозможности блокирования по причине уже существующих блокировок, процесс переходит в состояние сна, ожидая, пока последние будут освобождены. Последняя буква W в названии действия означает wait (ждать).

Стандартная библиотека ввода/вывода

Функции, которые мы только что рассмотрели представляют интерфейс ввода/вывода между приложениями и ядром операционной системы. Хотя их использование напоминает использование библиотечных функций С, по существу они представляют собой лишь "обертки" к функциям ядра UNIX, фактически выполняющим операции ввода/вывода.

Однако программисты редко используют этот интерфейс низкого уровня, предпочитая возможности, предоставляемые стандартной библиотекой ввода/вывода. Функции этой библиотеки обеспечивают буферизованный ввод/вывод и более удобный стиль программирования. Для использования функций этой библиотеки в программу должен быть включен файл заголовков . Эти функции входят в стандартную библиотеку С (libc.so или libc.a), которая, как правило, подключается по умолчанию на этапе связывания.

Вместо использования файлового дескриптора библиотека определяет указатель на специальную структуру данных (структура >FILE), называемый потоком или файловым указателем. Стандартные потоки ввода/вывода обозначаются символическими именами >stdin, >stdout, >stderr соответственно для потоков ввода, вывода и сообщений об ошибках. Они определены следующим образом:

>extern FILE *stdin;

>extern FILE *stdout;

>extern FILE *stderr;

Связь потоков стандартной библиотеки с файловыми дескрипторами приведена в табл. 2.9.


Таблица 2.9. Стандартные потоки и их дескрипторы

Файловый дескрипторПоток (указатель)Описание
0stdinСтандартный ввод
1stdoutСтандартный вывод
2stderrСообщения об ошибках

Таблица 2.10. Наиболее употребительные функции стандартной библиотеки ввода/вывода

ФункцияНазначение
fopen(3S)Открывает файл с указанным именем и возвращает файловый указатель, ассоциированный с данным файлом
fclose(3S)Закрывает поток, освобождая буферы
fflush(3S)Очищает буфер потока, открытого на запись
getc(3S)Считывает символ из потока
putc(3S)Записывает символ в поток
gets(3S)Считывает строку из потока
puts(3S)Записывает строку в поток
fread(3S)Считывает указанное число байтов из потока (бинарный ввод)
fwrite(3S)Записывает указанное число байтов в поток (бинарный вывод)
fseek(3S)Позиционирует указатель в потоке
printf(3S)Производит форматированный вывод
scanf(3S)Производит форматированный ввод
fileno(3S)Возвращает файловый дескриптор данного потока

Выбор между функциями интерфейса системных вызовов и стандартной библиотеки зависит от многих факторов, в частности, степени контроля ввода/вывода, переносимости программы, простоты. Взгляните, например, на следующие эквивалентные строки программы:

>write (1, "Здравствуй, Мир!\n", 16);

>printf("Здравствуй, Мир!\n");

В первой строке сообщение выводится с использованием системной функции write(2), во второй — с помощью библиотечной функции printf(3S). Помимо того, что второй вариант кажется более лаконичным, отметим еще ряд особенностей. В первом варианте пришлось сделать предположение о том, что файловый дескриптор стандартного вывода равен 1, что может оказаться несправедливым для некоторых систем. Также пришлось явно указать число символов в строке, т.к. write(2) не делает никаких предположений о формате вывода, трактуя его как последовательность байтов. В отличие от wite(2), printf(3S) распознает строки, представляющие собой последовательность символов, заканчивающихся нулем. Функция printf(3S) также позволяет отформатировать выводимые данные для представления их в требуемом виде.

Но основным достоинством функций библиотеки является буферизация ввода/вывода, позволяющая минимизировать число системных вызовов read(2) и write(2). При открытии файла и создании потока функции библиотеки автоматически размещают необходимые буферы, позволяя приложению не заботиться о них.