(* Второй пример работы с каналами *)
uses linux, stdio;

const
  MSGSIZE=16;
  msg1:array [0..MSGSIZE-1] of char = 'hello, world #1';
  msg2:array [0..MSGSIZE-1] of char = 'hello, world #2';
  msg3:array [0..MSGSIZE-1] of char = 'hello, world #3';

var
  inbuf:array [0..MSGSIZE-1] of char;
  fdr,fdw,j,pid:longint;
begin
  (* Открыть канал *)
  if not assignpipe (fdr,fdw) then
  begin
    perror ('Ошибка вызова pipe ');
    halt (1);
  end;
  pid := fork;
  case pid of
    -1:
    begin
      perror ('Ошибка вызова fork');
      halt (2);
    end;
    0:
    begin
      (* Это дочерний процесс, выполнить запись в канал *)
      fdwrite (fdw, msg1, MSGSIZE);
      fdwrite (fdw, msg2, MSGSIZE);
      fdwrite (fdw, msg3, MSGSIZE);
    end;
    else
    begin
      (* Это родительский процесс, выполнить чтение из канала *)
      for j := 1 to 3 do
      begin
        fdread (fdr, inbuf, MSGSIZE);
	writeln (inbuf);
      end;
      wait(nil);
    end;
  end;
  halt (0);
end.
