Скачиваний:
56
Добавлен:
08.01.2014
Размер:
2.6 Mб
Скачать

2.1.2. Системный вызовfdopen

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

Описание

uses linux;

Function fdOpen(PathName:String;flags:longint):longint;

Function fdOpen(PathName:Pchar;flags:longint):longint;

Function fdOpen(PathName:String;flags,mode:longint):longint;

Function fdOpen(PathName:Pchar;flags,mode:longint):longint;

Первый аргумент, pathname, является указателем на строку маршрутного имени открываемого файла. Значение pathname может быть абсолютным путем, например:

/usr/keith/junk

Данный путь задает положение файла по отношению к корневому каталогу. Аргумент pathname может также быть относительным путем, задающим маршрут от текущего каталога к файлу, например:

keith/junk

или просто:

junk

В последнем случае программа откроет файл junk в текущем каталоге. В общем случае, если один из аргументов системного вызова или библиотечной процедуры – имя файла, то в качестве него можно задать любое допустимое маршрутное имя файла UNIX.

Второй аргумент системного вызова fdopen, который в нашем описании называется flags, имеет целочисленный тип и определяет метод доступа. Параметр flags принимает одно из значений, заданных постоянными в модуле linux при помощи директивы const (fcntl является сокращением от file control, «управление файлом»). Так же, как и большинство стандартных модулей, файл linux.ppu может быть включен в программу при помощи директивы:

uses linux;

В модуле linux определены три постоянных, которые сейчас представляют для нас интерес:

Open_RDONLY Открыть файл только для чтения

Open_WRONLY Открыть файл только для записи

Open_RDWR Открыть файл для чтения и записи

В случае успешного завершения вызова fdopen и открытия файла возвращаемое вызовом fdopen значение будет содержать неотрицательное целое число – дескриптор файла. Значение дескриптора файла будет наименьшим целым числом, которое еще не было использовано в качестве дескриптора файла выполнившим вызов процессом – знание этого факта иногда может понадобиться. Как отмечено во введении, в случае ошибки вызов fdopen возвращает вместо дескриптора файла значение -1. Это может произойти, например, если файл не существует. Для создания нового файла можно использовать вызов fdopen с параметром flags, равным Open_CREAT, – эта операция описана в следующем разделе.

Необязательный (optional) третий параметр mode, используемый только вместе с флагом Open_CREAT, также будет обсуждаться в следующем разделе – он связан с правами доступа к файлу. Следует обратить внимание на квадратные скобки в описании, которые обозначают, что параметр mode является необязательным.

Следующий фрагмент программы открывает файл junk для чтения и записи и проверяет, не возникает ли при этом ошибка. Этот последний момент особенно важен: имеет смысл устанавливать проверку ошибок во все программы, которые используют системные вызовы, поскольку каким бы простым не было приложение, иногда может произойти сбой. В этом примере используются библиотечные процедуры writeln для вывода сообщения и halt – для завершения процесса. Обе эти процедуры являются стандартными в любой системе.

uses linux;

const

workfile = 'junk'; (* задать имя рабочего файла *)

var

filedes:integer;

begin

(* Открыть, используя постоянную Open_RDWR из модуля linux *)

(* Файл открывается для чтения/записи *)

filedes := fdopen (workfile, Open_RDWR);

if filedes = -1 then

begin

writeln('Невозможно открыть файл ', workfile);

halt(1); (* выход по ошибке *)

end;

writeln('Файл ', workfile, ' успешно открыт, дескриптор равен ', filedes);

(*

* Остальная программа

*)

halt(0); (* нормальный выход *)

end.

Обратите внимание, что используется halt с параметром 1 в случае ошибки, и 0 – в случае удачного завершения. Это соответствует соглашениям UNIX и является правильной практикой программирования. Как будет показано в следующих главах, после завершения программы можно получить передаваемый вызову halt аргумент (program’s exit status – код завершения программы).

Соседние файлы в папке Полищук, Семериков. Системное программирование в UNIX средствами Free Pascal