(* Программа proc_file -- поведение файлов при ветвлении *)
(* Предположим, что длина файла "data" не менее 20 символов *)
uses linux,stdio;

procedure fatal(s:pchar);
begin
  perror(s);
  halt(1);
end;

(* Вывести положение в файле *)
procedure printpos(_string:pchar;filedes:integer);
var
  pos:longint;
begin
  pos := fdseek (filedes, 0, SEEK_CUR);
  if pos=-1 then
    fatal ('Ошибка вызова lseek');
  writeln(_string,':',pos);
end;


var
  fd:integer;
  pid:longint;			(* идентификатор процесса *)
  buf:array [0..9] of char;	(* буфер данных для файла *)
begin
  fd := fdopen ('data', Open_RDONLY);
  if fd = -1 then
    fatal ('Ошибка вызова open ');

  fdread (fd, buf, 10);		(* переместить вперед указатель файла *)
  printpos ('До вызова fork', fd);
  (* Создать два процесса *)

  pid := fork;
  case pid of
    1:			(* ошибка *)
      fatal ('Ошибка вызова fork ');
    0:			(* потомок *)
    begin
      printpos ('Дочерний процесс до чтения', fd);
      fdread (fd, buf, 10);
      printpos ('Дочерний процесс после чтения', fd);
    end;
    else			(* родитель *)
    begin
      wait(nil);
      printpos ('Родительский процесс после ожидания', fd);
    end;
  end;
end.
