Системное программирование в UNIX средствами Free Pascal


         

для временного прекращения работы на


 (* Программа status -- получение статуса завершения потомка *)
uses linux,stdio;
var
  pid:longint;
  status, exit_status:integer;
begin
  pid := fork;
  if pid < 0 then
    fatal ('Ошибка вызова fork ');
  if pid = 0 then            (* потомок *)
  begin
    (* Вызвать библиотечную процедуру sleep
     * для временного прекращения работы на 4 секунды
     *)
    sleep(4);
    halt(5);                (* выход с ненулевым значением *)
  end;
  (* Если мы оказались здесь, то это родительский процесс, *)
  (* поэтому ожидать завершения дочернего процесса         *)
  pid := wait(@status);
  if pid = -1 then
  begin
    perror ('Ошибка вызова wait ');
    halt(2);
  end;
  (* Проверка статуса завершения дочернего процесса *)
  if WIFEXITED (status) then
  begin
    exit_status := WEXITSTATUS (status);
    writeln ('Статус завершения ',pid,' равен ', exit_status);
  end;
  halt(0);
end.
Значение, возвращаемое родительскому процессу при помощи вызова halt, записывается в старшие восемь бит целочисленной переменной status. Чтобы оно имело смысл, младшие восемь бит должны быть равны нулю. Функция WIFEXITED (определенная в модуле stdio) проверяет, так ли это на самом деле. Если WIFEXITED возвращает false, то это означает, что выполнение дочернего процесса было остановлено (или прекращено) другим процессом при помощи межпроцессного взаимодействия, называемого сигналом (signal) и рассматриваемого в главе 6.
Упражнение 5.8. Переделайте процедуру docommand так, чтобы она возвращала статус вызова halt выполняемой команды. Что должно происходить, если вызов wait возвращает значение -1?

Содержание  Назад  Вперед