(* Программа status2 -- получение статуса завершения
 * дочернего процесса при помощи вызова waitpid
 *)
uses linux,stdio,crt;

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

var
  pid:longint;
  status, exit_status:integer;
begin
  pid := fork;
  if pid < 0 then
    fatal ('Ошибка вызова fork ');

  if pid = 0 then			(* потомок *)
  begin
    (* Вызов библиотечной процедуры sleep
     * для приостановки выполнения на 4 секунды
     *)
    writeln ('Потомок ',getpid,' пауза...');
    sleep(4);
    halt(5);			(* выход с ненулевым значением *)
  end;

  (* Если мы оказались здесь, то это родительский процесс *)
  (* Проверить, закончился ли дочерний процесс, и если нет,  *)
  (* то сделать секундную паузу, и потом проверить снова     *)
  while (waitpid (pid, @status, WNOHANG) = 0) do
  begin
    writeln ('Ожидание продолжается...\n');
    sleep(1);
  end;

  (* Проверка статуса завершения дочернего процесса *)
  if WIFEXITED (status) then
  begin
    exit_status := WEXITSTATUS (status);
    writeln ('Статус завершения ',pid,' равен ', exit_status);
  end;

  halt(0);
end.
