(* Программа synchro -- пример использования вызова kill *)
uses linux,stdio;

const
  ntimes:integer=0;

procedure p_action(sig:integer);cdecl;
begin
  inc(ntimes);
  writeln ('Родительский процесс получил сигнал ', ntimes, ' раз(а)');
end;

procedure c_action(sig:integer);cdecl;
begin
  inc(ntimes);
  writeln ('Дочерний процесс получил сигнал ', ntimes, ' раз(а)');
end;


var
  pid, ppid:longint;
  pact, cact:sigactionrec;
begin
  (* Задать обработчик сигнала SIGUSR1 в родительском процессе *)
  pact.handler.sh := @p_action;
  sigaction (SIGUSR1, @pact, nil);

  pid := fork;
  case pid of
    -1:			(* ошибка *)
    begin
      perror ('synchro');
      halt(1);
    end;
    0:			(* дочерний процесс *)
    begin
      (* Задать обработчик в дочернем процессе *)
      cact.handler.sh := @c_action;
      sigaction (SIGUSR1, @cact, nil);
      (* Получить идентификатор родительского процесса *)
      ppid := getppid;
      while true do
      begin
        sleep (1);
        kill (ppid, SIGUSR1);
        pause;
      end;
      (* Бесконечный цикл *)
    end;
    else			(* родительский процесс *)
      while true do
      begin
        pause;
	sleep (1);
	kill (pid, SIGUSR1);
      end;
      (* Бесконечный цикл *)
  end;
end.
