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

тип последнего параметра может меняться


uses linux;
/* Примечание: тип последнего параметра может меняться */
Function Fcntl(filedes:longint;Cmd:Integer):integer;
Function Fcntl(var filedes:Text;Cmd:Integer):integer;
Procedure Fcntl(Fd:text;Cmd:Integer;Arg:longint);
Procedure Fcntl(Fd:longint;Cmd:longint;Arg:Longint);
Системный вызов fcntl работает с открытым файлом, заданным дескриптором файла filedes. Конкретная выполняемая функция задается выбором одного из значений параметра cmd из модуля linux. Тип третьего параметра зависит от значения параметра cmd. Например, если вызов fcntl используется для установки флагов статуса файла, тогда третий параметр будет целым числом. Если же, как можно будет увидеть позже, вызов fcntl будет использоваться для блокировки файла, то третий параметр будет указателем на структуру lock. Иногда третий параметр вообще не используется.
Некоторые из этих функций относятся к взаимодействию файлов и процессов, и мы не будем рассматривать их здесь; тем не менее две из этих функций, заданные значениями F_GETFL и F_SETFL параметра cmd, представляют для нас сейчас интерес.
При задании параметра F_GETFL вызов fcntl возвращает текущие флаги статуса файла, установленные вызовом fdopen. Следующая функция filestatus использует fcntl для вывода текущего статуса открытого файла.
(*
 * Функция filestatus описывает текущий статус файла
 *)
uses linux;


function filestatus(filedes:integer):integer;
var
  arg1:integer;
begin
  arg1 := fcntl (filedes, F_GETFL);
  if arg1 = -1 then
  begin
    writeln('Ошибка чтения статуса файла');
    filestatus := -1;
    exit;
  end;
  write('Дескриптор файла ', filedes, ': ');
  (*
   * Сравнить аргумент с флагами открытия файла.
   *)
  case (arg1 and Open_ACCMODE) of
    Open_WRONLY:
      write('Только для записи');
    Open_RDWR:
      write('Для чтения-записи');
    Open_RDONLY:
      write('Только для чтения');
    else
      write('Режим не существует');
  end;
  if (arg1 and Open_APPEND)<>0 then


    write (' - установлен флаг append');
  writeln;
  filestatus := 0;
end;
Следует обратить внимание на проверку установки определенного бита во флаги статуса файла в переменной arg1 при помощи побитового оператора И, обозначаемого AND. Поле интересующих нас битов вырезается с помощью специальной маски Open_ACCMODE, определенной в модуле linux. Дальнейшие действия осуществляются с учетом того, что в данном поле не может быть выставлено более одного бита, поскольку эти три режима доступа к файлу не совместимы.
Значение F_SETFL используется для переустановки связанных с файлом флагов статуса. Новые флаги задаются в третьем аргументе вызова fcntl. При этом могут быть установлены только некоторые флаги, например, нельзя вдруг превратить файл, открытый только для чтения, в файл, открытый для чтения и записи. Тем не менее с помощью F_SETFL можно задать режим, при котором все следующие операции записи будут только дописывать информацию в конец файла:
if (fcntl(filedes, F_SETFL, Open_APPEND) = -1) then
  writeln('Ошибка вызова fcntl');

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