Пример docommand
Модуль stdio предоставляет библиотечную процедуру runshell, которая позволяет выполнить в программе команду оболочки. Для примера создадим упрощенную версию этой процедуры docommand, используя вызовы fork и ехес. В качестве посредника вызовем стандартную оболочку (заданную именем /bin/sh), а не будем пытаться выполнять программу напрямую. Это позволит программе docommand воспользоваться преимуществами, предоставляемыми оболочкой, например, раскрытием шаблонов имен файлов. Задание параметра -с
вызова оболочки определяет, что команды передаются не со стандартного ввода, а берутся из следующего строчного аргумента.
(* Программа docommand -- запуск команды оболочки, первая версия *)
uses linux,stdio;
function docommand(command:pchar):integer;
var
pid:longint;
begin
pid := fork;
if pid < 0 then
begin
docommand:=-1;
exit;
end;
if pid = 0 then (* дочерний процесс *)
begin
linuxexecl('/bin/sh', 'sh', ['-c', command, nil]);
perror ('execl');
halt(1);
end;
(* Код родительского процесса *)
(* Ожидание возврата из дочернего процесса *)
wait(nil);
docommand:=0;
end;
begin
docommand('ls -l | wc -l');
end.
Следует сказать, что это только первое приближение к настоящей библиотечной процедуре runshell. Например, если конечный пользователь программы нажмет клавишу прерывания во время выполнения команды оболочки, то и вызывающая программа, и команда остановятся. Существуют способы обойти это ограничение, которые будут рассмотрены в следующей главе.