Linux. Как запустить внешнюю программу

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
fraks

Сообщение fraks »

Надо запустить программку на линухе и вокруг нее совершить несколько телодвижений (до запуска сгенерить командную строку, после - переименовать файл и опять запустить ее же и так по кругу).

На линухе ничего не знаю, Delphi владею.
Изучать bash, perl - охоты нету.

Подскажите в сторону какой функции смотреть.
Примерчик тоже был бы очень кстати.

Хочется чего-то вроде:

Код: Выделить всё

program tt
var
  FileName: string;
  FileIndex: integer;
  CMD: string;
begin
  FileIndex := 0;
  while True do begin
    FileName := 'log.' + IntToStr(FileIndex);
    CMD := 'tcpdump -c 1000 -e -tttt -n -nn -i eth0 -l -> ' + FileName;
    Exec(CMD); {вот здесь какую функцию применить?}
    Inc(FileIndex);
  end;{while}
end.
Аватара пользователя
STAKANOV
энтузиаст
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение STAKANOV »

Exec(CMD); {вот здесь какую функцию применить?}


модуль BaseUnix, функция <a href='http://www.freepascal.org/docs-html/rtl/baseunix/fpexecv.html' target='_blank'>FpExecv</a>

только обрати внимание - там запускаемая программа и аргументы в разных перемнных

хотя наверно даже лучше <a href='http://www.freepascal.org/docs-html/rtl/sysutils/executeprocess.html' target='_blank'>ExecuteProcess</a> из модуля sysutils.
fraks

Сообщение fraks »

хотя наверно даже лучше <a href='http://www.freepascal.org/docs-html/rtl/sysutils/executeprocess.html' target='_blank'>ExecuteProcess</a> из модуля sysutils.


Попробовал. Получается.

Но возникла загвоздка - поймать вывод запущенной программы.
Думалось что воспользуюсь простым перенаправлением вывода и потом уже с этим файлом и буду работать. Но не тут-то было.
На сколько я понял перенаправление с помощью > >> 1> 2> это функции bash и подобного, а при прямом запуске через ExecuteProcess bash тут никаким боком не участвует.

Соответственно вопрос - как в программе на FPC получить вывод StdOut запускаемой программы?
fraks

Сообщение fraks »

Или как завернуть StdOut запускаемой программы в файл.
fraks

Сообщение fraks »

Нашел что для контроля StdIn и StdOut запускаемого процесса можно использовать TProcess, но кол-во кода при этом превышает смысл использования FPC. Пришлось почитать про bash и реализовать нужное в 5 строк.

Всем спасибо за советы.
Илья Аввакумов
новенький
Сообщения: 50
Зарегистрирован: 04.05.2005 15:06:42
Откуда: Екатеринбург

Сообщение Илья Аввакумов »

Я всегда решеал такие вопросы с помощью скриптов. Программа на FPC их генерирует, запускает, а они делают свое дело.
...
// формируется step
Assign(f,'run.bat');
Rewrite(f);
Writeln( f, ’#!/bin/sh’ );
Writeln( f, './gulp < step > ostep');
Close(f);
Chmod('run.bat', octal(777));
Execl('./run.bat');
// анализируется ostep
mif
новенький
Сообщения: 71
Зарегистрирован: 14.12.2005 09:09:27

Сообщение mif »

Program test;
uses dos;
Var
path,cmdline:string;
begin
path:='/some_path';
Readln(cmd);
exec(path,cmdline);
end.

Вот и все в линухе работает норм, как и под мелкософтом
Ответить