Системное программирование в UNIX средствами Free Pascal

Создание файла при помощи вызова fdopen


Вызов fdopen может использоваться для создания файла, например:

filedes := fdopen('/tmp/newfile', Open_WRONLY or Open_CREAT, octal(0644));

Здесь объединены флаги Open_CREAT и Open_WRONLY, задающие создание файла /tmp/newfile при помощи вызова fdopen. Если /tmp/newfile не существует, то будет создан файл нулевой длины с таким именем и открыт только для записи.

В этом примере вводится третий параметр mode вызова fdopen, который нужен только при создании файла. Не углубляясь в детали, заметим, что параметр mode содержит число, определяющее права доступа (access permissions) к файлу, указывающие, кто из пользователей системы может осуществлять чтение, запись или выполнение файла. В вышеприведенном примере используется восьмеричное значение 0644. При этом пользователь, создавший файл, может выполнять чтение из файла и запись в него. Остальные пользователи будут иметь доступ только для чтения файла. В следующей главе показано, как вычисляется это значение. Для простоты оно будет использовано во всех примерах этой главы.

Следующая программа создает файл newfile в текущем каталоге:

uses linux;

const

  PERMS=0644;          (* права доступа при открытии с Open_CREAT *)

  filename='newfile';

var

  filedes:integer;

 

begin



  filedes := fdopen (filename, Open_RDWR or Open_CREAT, octal(PERMS));

  if filedes = -1 then

  begin

    writeln('Не могу создать ', filename);

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

  end;

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

 

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

  halt(0);

end.

Что произойдет, если файл newfile уже существует? Если позволяют права доступа к нему, то он будет открыт на запись, как если бы флаг Open_CREAT не был задан. В этом случае параметр mode не будет иметь силы. С другой стороны, объединение флагов Open_CREAT и Open_EXCL (exclusive – исключительный) приведет к ошибке во время вызова fdcreat, если файл уже существует. Например, следующий вызов




fd := fdopen('lock', Open_WRONLY or Open_CREAT or Open_EXCL, octal(0644));

означает, что если файл lock не существует, его следует создать с правами доступа 0644. Если же он существует, то в переменную fd будет записано значение -1, свидетельствующее об ошибке. Имя файла lock (защелка) показывает, что он создается для обозначения исключительного доступа к некоторому ресурсу.

Еще один полезный флаг – флаг Open_TRUNC. При его использовании вместе с флагом Open_CREAT файл будет усечен до нулевого размера, если он существует, и права доступа к файлу позволяют это. Например:

fd := fdopen ('file', Open_WRONLY or Open_CREAT or Open_TRUNC, octal(0644));

Это может понадобиться, если вы хотите, чтобы программа писала данные поверх данных, записанных во время предыдущих запусков программы.

Упражнение 2.2. Интересно, что флаг Open_TRUNC может использоваться и без флага Open_CREAT. Попытайтесь предугадать, что при этом получится, а затем проверьте это при помощи программы в случаях, когда файл существует и не существует.

Существует возможность установить размер файла не только в 0, но и в любое заданное количество байт. Это позволяет сделать функция fdTruncate.


Содержание раздела