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




Командный интерпретатор smallsh - часть 5


where. Если параметр where принимает значение BACKGROUND, определенное в файле smallsh.inc, то вызов waitpid пропускается, и процедура runcommand просто выводит идентификатор процесса и завершает работу.

{$i smallsh.inc}

(* Выполнить команду, возможно ожидая ее завершения *)

function runcommand(cline:ppchar;where:integer):integer;

var

  pid:longint;

  status:integer;

begin

  pid := fork;

  case pid of

    -1:

    begin

      perror ('smallsh');

      runcommand:=-1;

      exit;

    end;

    0:

    begin

      execvp (cline^, cline, envp);

      perror (cline^);

      halt(1);

    end;

  end;

  (* Код родительского процесса *)

  (* Если это фоновый процесс, вывести pid и выйти *)

  if where = BACKGROUND then

  begin

    writeln ('[Идентификатор процесса ',pid,']');

    runcommand:=0;

    exit;

  end;

  (* Ожидание завершения процесса с идентификатором pid *)

  if waitpid (pid, @status, 0) = -1 then

    runcommand:=-1

  else

    runcommand:=status;

end;

Обратите внимание, что простой вызов wait из функции docommand был заменен вызовом waitpid. Это гарантирует, что выход из процедуры docommand произойдет только после завершения процесса, запущенного в этом вызове docommand, и помогает избавиться от проблем с фоновыми процессами, которые завершаются в это время. (Если это кажется не совсем ясным, следует вспомнить, что вызов wait возвращает идентификатор первого завершающегося дочернего процесса, а не идентификатор последнего запущенного.)

Процедура runcommand также использует системный вызов execvp. Это гарантирует, что при запуске программы, заданной командой, выполняется ее поиск во всех каталогах, указанных в переменной окружения PATH, хотя, в отличие от настоящего командного интерпретатора, в программе smallsh нет никаких средств для работы с переменной PATH.

Последний шаг состоит в написании программы, которая связывает вместе остальные функции. Это простое упражнение:

(* Программа smallsh - простой командный интерпретатор *)




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