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



         

Описание


uses linux;

function MUnMap(address:Pointer; length:Longint):Boolean;

Если был задан флаг MAP_SHARED, то в файл вносятся все оставшиеся изменения, при флаге MAP_PRIVATE все изменения отбрасываются.

Следует иметь в виду, что эта функция только отменяет отображение файла в память, но не закрывает файл. Файл требуется закрыть при помощи системного вызова fdсlose.

Следующий пример повторяет программу copyfile, последний вариант которой был рассмотрен в разделе 11.4. Эта программа открывает входной и выходной файлы и копирует один из них в другой. Для простоты опущена часть процедур обработки ошибок.

uses linux;

var

  i, input, output, filesize:longint;

  source, target:pchar;

  args:tmmapargs;

const 

  endchar:char=#0;

type

  oearray=array [0..0] of char;

  poearray=^oearray;

begin

  (* Проверка числа входных параметров *)

  if paramcount <> 2 then

  begin

    writeln(stderr, 'Синтаксис: copyfile источник цель');

    halt (1);

  end;

  (* Открыть входной и выходной файлы *)

  input := fdopen (paramstr(1), Open_RDONLY);

  if input = -1 then

  begin

    writeln(stderr, 'Ошибка при открытии файла ', paramstr(1));

    halt (1);

  end;

  output := fdopen (paramstr(2), Open_RDWR or Open_CREAT or Open_TRUNC, octal(0666));

  if output = -1 then

  begin

    fdclose (input);

    writeln(stderr, 'Ошибка при открытии файла ', paramstr(2));

    halt (2);

  end;

  (* Создать второй файл с тем же размером, что и первый. *)

  filesize := fdseek (input, 0, SEEK_END);

  fdseek (output, filesize - 1, SEEK_SET);

  fdwrite (output, endchar, 1);

  (* Отобразить в память входной и выходной файлы. *)

  args.fd:=input;

  args.flags:=MAP_SHARED;

  args.prot:=PROT_READ;

  args.size:=filesize;

  args.address:=0;

  args.offset:=0;

  source:=pchar(mmap(args));

  if longint(source) = -1 then

  begin

    writeln(stderr, 'Ошибка отображения файла 1 в память');

    halt (1);

  end;

  args.fd:=output;

  args.flags:=MAP_SHARED;

  args.prot:=PROT_WRITE;

  args.size:=filesize;

  args.address:=0;

  args.offset:=0;

  target:=pchar(mmap(args));

  if longint(target) = -1 then

  begin

    writeln(stderr, 'Ошибка отображения файла 2 в память');

    halt (1);

  end;

  (* Копирование *)

  for i:=0 to filesize-1 do

    poearray(target)^[i] := poearray(source)^[i];

  (* Отменить отображение обоих файлов *)

  munmap (source, filesize);

  munmap (target, filesize);

  (* Закрыть оба файла *)

  fdclose (input);

  fdclose (output);

  halt (0);

end.

Конечно, файлы были бы автоматически закрыты при завершении программы. Вызовы munmap включены для полноты изложения.




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