Скачиваний:
63
Добавлен:
08.01.2014
Размер:
2.6 Mб
Скачать

Описание

uses linux;

Function Utime(path:pathstr; utim:utimbuf):Boolean;

Например:

Uses linux;

Var utim : utimbuf;

year,month,day,hour,minute,second : Word;

begin

{ Set access and modification time of executable source }

GetTime (hour,minute,second);

GetDate (year,month,day);

utim.actime:=LocalToEpoch(year,month,day,hour,minute,second);

utim.modtime:=utim.actime;

if not Utime('ex25.pp',utim) then

writeln ('Call to UTime failed !')

else

begin

Write ('Set access and modification times to : ');

Write (Hour:2,':',minute:2,':',second,', ');

Writeln (Day:2,'/',month:2,'/',year:4);

end;

end.

Следующий пример – процедура filedata выводит данные, связанные с файлом, определяемым переменной pathname. Пример сообщает размер файла, идентификатор пользователя, группу файла, а также права доступа к файлу.

Чтобы преобразовать права доступа к файлу в удобочитаемую форму, похожую на результат, выводимый командой ls, был использован массив octarray чисел типа integer, содержащий значения для основных прав доступа, и массив символов perms, содержащий символьные эквиваленты прав доступа.

(* Процедура filedata выводит данные о файле *)

uses linux;

(*

* Массив octarray используется для определения

* установки битов прав доступа.

*)

const

octarray:array[0..8] of integer= (

0400, 0200, 0100,

0040, 0020, 0010,

0004, 0002, 0001);

(*

* Мнемонические коды для прав доступа к файлу,

* длиной 10 символов, включая нулевой символ в конце строки.

*)

const

perms:pchar = 'rwxrwxrwx';

function filedata(pathname:string):integer;

var

statbuf:tstat;

descrip:array [0..9] of char;

j:integer;

begin

if not fstat (pathname, statbuf) then

begin

writeln('Ошибка вызова stat для ', pathname);

filedata:=-1;

exit;

end;

(* Преобразовать права доступа в удобочитаемую форму *)

for j:=0 to 8 do

begin

(*

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

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

*)

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). Это утилита, которая предназначена для запуска в качестве фонового процесса.1

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

Соседние файлы в папке Полищук, Семериков. Системное программирование в UNIX средствами Free Pascal