Системное программирование в 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, если файл уже существует. Например, следующий вызов




Содержание  Назад  Вперед