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

Пример 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. Например, если конечный пользователь программы нажмет клавишу прерывания во время выполнения команды оболочки, то и вызывающая программа, и команда остановятся. Существуют способы обойти это ограничение, которые будут рассмотрены в следующей главе.



Содержание раздела