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


         

Более полезным инструментом является следующая


      (*
       * Проверить, установлены ли права доступа
       * при помощи побитового И
       *)
      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 должна копировать его на свой стандартный вывод. Как можно убедиться (или предположить), что обновление файла закончено до того, как он будет скопирован?

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