Если параметр where принимает значение
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 - простой командный интерпретатор *)
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий