Системное программирование в 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




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