uses linux,stdio;

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


var
  pid:longint;
  status, exit_status, sig_no:integer;
begin
  pid := fork;
  if pid < 0 then
    fatal ('Ошибка вызова fork ');
  if pid = 0 then			(* потомок *)
  begin
    (* Вызов библиотечной процедуры sleep
     * для приостановки выполнения на 20 секунд
     *)
    writeln ('Потомок ',getpid,', пауза 20 секунд ...');
    sleep(20);
    halt(5);			(* выход с ненулевым значением *)
  end;
  (* Если мы оказались здесь, то это родительский процесс *)
  pid := wait (@status);
  if pid = -1 then
  begin
    perror ('Ошибка вызова wait');
    halt(1);
  end;
  (* Проверка нормального завершения дочернего процесса *)
  if WIFEXITED (status) then
  begin
    exit_status := WEXITSTATUS (status);
    writeln ('Статус завершения ',pid,' был ', exit_status);
  end;
  (* Проверка, получил ли дочерний процесс сигнал *)
  if WIFSIGNALED (status) then
  begin
    sig_no := WTERMSIG (status);
    writeln ('Сигнал номер ',sig_no,' завершил процесс ', pid);
    if WCOREDUMP (status) then
      writeln ('... создан файл дампа памяти');
  end;
  (* Проверка остановки дочернего процесса. *)
  if WIFSTOPPED (status) then
  begin
    sig_no := WSTOPSIG (status);
    writeln ('Сигнал номер ',sig_no,' остановил процесс ', pid);
  end;
  halt(0);
end.
