А. Робачевский - Операционная система UNIX (1114671), страница 26
Текст из файла (страница 26)
Новый файловый дескрип%тор будет указывать на тот же открытый файл, что и f ildes. Дейст%вие аналогично вызову функцииилиF_GETFDВозвратить признак сохранения дескриптора при запуске новойпрограммы (выполнении системного вызова— флаг(FD_CLOEXEC). Если флаг установлен, то при вызове ехес(2)файл, ассоциированный с данным дескриптором, будет закрытУстановить флагсогласно значению, заданномутретьим аргументомВозвратить режим доступа к файлу, ассоциированному с данным де%скриптором.
Флаги, установленные в возвращаемом значении, пол%ностью соответствуют режимам открытия файла, задаваемым функ%ции ореп(2). Их значения приведены в табл. 2.8. Рассмотрим пример:=F_GETFL,биты, определяющие режимaccbits =&if (accbits == 0_RDONLY)открыт только дляelse if (accbits ==открыт только дляfddup =F_SETFDF_GETFLF_DUPFD,fildes2)else if (accbitsоткрыт для чтения иȾɚɧɧɚɹɜɟɪɫɢɹɤɧɢɝɢɜɵɩɭɳɟɧɚɷɥɟɤɬɪɨɧɧɵɦɢɡɞɚɬɟɥɶɫɬɜɨɦ%RRNVVKRSɊɚɫɩɪɨɫɬɪɚɧɟɧɢɟɩɪɨɞɚɠɚɩɟɪɟɡɚɩɢɫɶɞɚɧɧɨɣɤɧɢɝɢɢɥɢɟɟɱɚɫɬɟɣɁȺɉɊȿɓȿɇɕɈɜɫɟɯɧɚɪɭɲɟɧɢɹɯɩɪɨɫɶɛɚɫɨɨɛɳɚɬɶɩɨɚɞɪɟɫɭpiracy@books-shop.com130Глава 2. СредаF_SETFLUNIXУстановить режим доступа к файлу согласно значению, переданно%му в третьем аргументе.
Могут быть изменены только флаги0_APPEND, 0_NONBLOCK, 0_SYNC И 0_ASYNC.F_GETLKF_SETLKF_SETLKWПроверить существование блокирования записи файла. Блокирова%ние записи, подлежащее проверке, описывается структуройуказатель на которую передается в качестве третьего аргумента.Если существующие установки не позволяют выполнить блокирова%ние, определенное структуройпоследняя будет возвращенас описанием текущего блокирования записи. Данная команда неустанавливает блокирование, а служит для проверки его возможно%сти.
Более подробно блокирование записей описано в главе 4, вразделе "Блокирование доступа к файлу".Установить блокирование записи файла. Структураописыва%ет блокирование, и указатель на нее передается в качестве третьегоаргумента. При невозможности блокирования fcntl(2) возвращаетсяС ошибкой EACCESS ИЛИ EAGAIN.Аналогично предыдущему, но при невозможности блокирования попричине уже существующих блокировок, процесс переходит в со%стояние сна, ожидая, пока последние будут освобождены.
Послед%няя буква W в названии действия означает wait (ждать).Стандартная библиотека ввода/выводаФункции, которые мы только что рассмотрели представляют интерфейсввода/вывода между приложениями и ядром операционной системы. Хотяих использование напоминает использование библиотечных функций С,по существу они представляют собой лишь "обертки" к функциям ядраUNIX, фактически выполняющим операции ввода/вывода.Однако программисты редко используют этот интерфейс низкого уровня,предпочитая возможности, предоставляемые стандартной библиотекойввода/вывода. Функции этой библиотеки обеспечиваютввод/вывод и более удобный стиль программирования. Для использованияфункций этой библиотеки в программу должен быть включен файл заго!ловков <stdio.h>. Эти функции входят в стандартную библиотеку С (libc.soиликоторая, как правило, подключается по умолчанию на этапесвязывания.Вместо использования файлового дескриптора библиотека определяет ука!затель на специальную структуру данных (структура FILE), называемыйпотоком или файловым указателем.
Стандартные потоки ввода/выводаобозначаются символическими именамиstdout, stderr соответ!ственно для потоков ввода, вывода и сообщений об ошибках. Они опреде!лены следующим образом:extern FILEextern FILEextern FILEwww.books-shop.comРабота с файламиСвязь потоков стандартной библиотеки с файловыми дескрипторами при!ведена в табл. 2.9.Таблица 2.9. Стандартные потоки и их дескрипторыФайловый дескриптор12Поток (указатель)stderrОписаниеСтандартный вводСтандартный выводСообщения об ошибкахТаблица 2.10. Наиболее употребительные функции стандартной библиотекиФункцияНазначениеfopen(3S)Открывает файл с указанным именем и возвращает файловый ука%затель, ассоциированный с данным файломfclose(3S)Закрывает поток, освобождая буферыОчищает буфер потока, открытого на записьgetc(3S)Считывает символ из потокаputc(3S)Записывает символ в потокgets(3S)Считывает строку из потокаЗаписывает строку в потокСчитывает указанное число байтов из потока (бинарный ввод)Записывает указанное число байтов в поток (бинарный вывод)fseek(3S)Позиционирует указатель в потокеПроизводит форматированный выводscanf(3S)Производит форматированный вводВозвращает файловый дескриптор данного потокаВыбор между функциями интерфейса системных вызовов и стандартнойбиблиотеки зависит от многих факторов, в частности, степени контроляввода/вывода, переносимости программы, простоты.
Взгляните, например,на следующие эквивалентные строки программы:(1, "Здравствуй,printfВ первой строке сообщение выводится с использованием системной функ!цииво второй — с помощью библиотечной функции printf(3S).Помимо того, что второй вариант кажется более лаконичным, отметимеще ряд особенностей. В первом варианте пришлось сделать предположе!ние о том, что файловый дескриптор стандартного вывода равен 1, чтоможет оказаться несправедливым для некоторых систем. Также пришлосьwww.books-shop.comГлава 2.программирования UNIXявно указать число символов в строке, т. к.не делает никакихпредположений о формате вывода, трактуя его как последовательностьбайтов.
В отличие отраспознает строки, представляющиесобой последовательность символов, заканчивающихся нулем. Функциятакже позволяет отформатировать выводимые данные для пред!ставления их в требуемом виде.Но основным достоинством функций библиотеки является буферизацияввода/вывода, позволяющая минимизировать число системных вызововread(2) иПри открытии файла и создании потока функции биб!лиотеки автоматически размещают необходимые буферы, позволяя прило!жению не заботиться о них.Библиотека предоставляет три типа буферизации:Полная буферизация. В этом случае операция чтения или записи за!вершается после того, как будет заполнен буфер ввода/вывода.Ввод/вывод для дисковых файлов, как правило, полностью буфери!зируется.
Буфер размещается с помощью функции malloc(3C) припервом обращении к потоку для чтения или записи и заполняетсясистемными вызовамиилиЭто означает, что после!дующие вызовы getc(3S), gets(3S),puts(3S) и т. д. не иниции!руют обращений к системным функциям, а будут производить чте!ние или запись из буфера библиотеки.
Содержимое буфера очищает!ся (т. е. данные сохраняются на диске) автоматически, либо при вы!зове функциибуферизация. В этом случае библиотека выполняет фак!тический ввод/вывод (т. е. производит системные вызовы read(2) илипострочно при обнаружении конца строки (символа перево!да каретки).
Такой тип буферизации обычно используется для ассо!циированных с терминальными устройствами потоков, которыми,как правило являются стандартные потоки ввода и вывода.Отсутствие буферизации. В этом случае библиотека не производитникакой буферизации, фактически являясь только программнойоболочкой системных вызовов. При этом достигаются минимальныезадержки операций чтения и записи, необходимые, например, привыводе сообщений об ошибках. Отсутствие буферизации характернодля стандартного потока вывода сообщений об ошибках.Характер буферизации может быть изменен с помощью функций:<stdio.h>voidintcharchar *buf, int type,Функция setbuf(3S) позволяет включить или отключить буферизацию дляпотока stream.
В первом случае buf должен указывать на буфер размеромво втором его значение должно быть равно NULL.www.books-shop.com133Работа с файламиФункцияпозволяет производить более тонкое управление буфе!ризацией, явно указывая, какой ее тип мы хотим установить. Для этого ис!пользуется аргумент type, который может принимать следующие значения:_IOFBFПолная буферизация_IOLBFПострочная буферизацияОтсутствие буферизацииВ случае полной или построчной буферизации аргументразмер буфера, адресованного указателемопределяетКаждый поток стандартной библиотеки представлен указателем на струк!туру FILE, показанную на рис. 2.9, в которой хранится указатель на буфер_base, указатель на следующий символ, подлежащий чтению или записичисло байт в буфере _cnt, указатель на файловый дескриптор_file, с которым ассоциирован данный поток, а также флаги состоянияпотока _f lag.