(* Запись в канал до возникновения блокировки записи *)
uses linux,stdio;

var
  count:integer;

(* Вызывается при получении сигнала SIGALRM *)
procedure alrm_action(signo:integer);cdecl;
begin
  writeln ('Запись блокируется после вывода ',count,' символов');
  halt (0);
end;

const
  c:char='x';
var
  fdin,fdout,pipe_size:longint;
  act:sigactionrec;
  temp:sigset_t;
begin
  (* Задать обработчик сигнала *)
  act.handler.sh := @alrm_action;
  sigfillset (@temp);
  act.sa_mask:=temp.__val[0];
  (* Создать канал *)
  if not assignpipe (fdin,fdout) then
  begin
    perror ('Ошибка вызова pipe ');
    halt (1);
  end;
  (* Определить размер канала *)
  pipe_size := fpathconf (fdin, _PC_PIPE_BUF);
  writeln('Максимальный размер канала: ',pipe_size,' байт');
  (* Задать обработчик сигнала *)
  sigaction (SIGALRM, @act, nil);
  while true do
  begin
    (* Установить таймер *)
    alarm (20);
    (* Запись в канал *)
    fdwrite (fdout, c, 1);
    (* Сбросить таймер *)
    alarm (0);
    inc(count);
    if count mod 1024 = 0 then
      writeln (count, ' символов в канале');
  end;
end.
