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




Описание - часть 2


      (*

       * Проверить, установлены ли права доступа

       * при помощи побитового И

       *)

      if (statbuf.mode and octal(octarray[j]))<>0 then

        descrip[j] := perms[j]

      else

        descrip[j] := '-';

  end;

  descrip[9] := #0;          (* задать строку *)

  (* Вывести информацию о файле *)

  writeln(#10'Файл ', pathname, ':');

  writeln('Размер ',statbuf.size,' байт');

  writeln('User-id ',statbuf.uid,', Group-id ',statbuf.gid,#10);

  writeln('Права доступа: ', descrip);

  filedata:=0;

end;

Более полезным инструментом является следующая программа lookout. Она раз в минуту проверяет, изменился ли какой-либо из файлов из заданного списка, опрашивая время модификации каждого из файлов (mtime). Это утилита, которая предназначена для запуска в качестве фонового процесса.[3]

(* Программа lookout сообщает об изменении файла *)

uses linux, stdio;

const

  MFILE=10;

var

  sb:tstat;

  j:integer;

  last_time:array [1..MFILE] of longint;

procedure sleep(t:longint);cdecl;external 'c';

procedure cmp(name:string;last:longint);

begin

  (*

   * Проверять время изменения файла,

   * если можно считать данные о файле.

   *)

  if not fstat(name,sb) or (sb.mtime <> last) then

  begin

    writeln('lookout: файл ',name,' изменился');

    halt(0);

   end;

end;

begin

  if (paramcount < 1) then

  begin

    writeln('Применение: lookout имя_файла ...');

    halt(1);

  end;

  if (paramcount > MFILE) then

  begin

    writeln('lookout: слишком много имен файлов');

    halt (1);

  end;

  (* Инициализация *)

  for j:=1 to paramcount do

  begin

    if not fstat(paramstr(j), sb) then

    begin

      writeln ('lookout: ошибка вызова stat для ', paramstr(j));

      halt(1);

    end;

    last_time[j]:=sb.mtime;

  end;

  (* Повторять до тех пор, пока файл не изменится *)

  while true do

  begin

    for j:=1 to paramcount do

      cmp(paramstr(j), last_time[j]);

      (*

       * Остановиться на 60 секунд.

       * Функция 'sleep' стандартная

       * библиотечная процедура UNIX.

       *)

    sleep (60);

  end;

end.

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

Упражнение 3.10. Напишите программу slowwatch, которая периодически проверяет время изменения заданного файла (она не должна завершаться ошибкой, если файл изначально не существует). При изменении файла программа slowwatch должна копировать его на свой стандартный вывод. Как можно убедиться (или предположить), что обновление файла закончено до того, как он будет скопирован?




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