Вызов внешней программы
Как это можно сделать? Это вроде через переключение потоков делается, но нигде не могу инфы по этому найти :(
Нужно в Unix из программы C++ вызвать интерпретатор Perl (/usr/local/perl), передать ему программный код на языке Perl и получить результат выполенения Perl-программы.
Как это можно сделать? Это вроде через переключение потоков делается, но нигде не могу инфы по этому найти :(
хм.... незнаю как в юникс, но в винде в билдере для этого есть функция exec, про нее почитай
хм.... незнаю как в юникс, но в винде в билдере для этого есть функция exec, про нее почитай
в UNIX она тоже есть :)
решение задачи зависит от того, что именно надо сделать. если просто вызвать интерпретатор и передать ему фиксированный скрипт, то проще всего использовать функцию system(3). Например, перловый код следующий:
print "Hello World!\n";
программа на С будет выглядеть так:
int main()
{
system("/usr/bin/perl /home/squirl/perlcode/helloworld.pl");
return 0;
}
если же надо что то более сложное, нужно использовать связку fork+exec в явном виде.
man 3 exec
man 2 fork
Нужно в Unix из программы C++ вызвать интерпретатор Perl (/usr/local/perl), передать ему программный код на языке Perl и получить результат выполенения Perl-программы.
Как это можно сделать? Это вроде через переключение потоков делается, но нигде не могу инфы по этому найти :(
man popen
man popen
popen может быть открыт только для чтения ИЛИ записи (а не одновреиенно для чтения и записи), поэтому не смогу с помощью popen сначала записать, а потом сразу же прочитать данные из /usr/local/perl.
Мне же нужно сделать следующее (по порядку):
1. Открыть через вою прогу интерпретатор /usr/local/perl
2. Передать ему код своей perl-программы
3. Получить от него результат выполнения этой perl-программы
4. Вывести этот результат в stdout.
А как такое сделать через си на Unix?
popen может быть открыт только для чтения ИЛИ записи (а не одновреиенно для чтения и записи), поэтому не смогу с помощью popen сначала записать, а потом сразу же прочитать данные из /usr/local/perl.
Мне же нужно сделать следующее (по порядку):
1. Открыть через вою прогу интерпретатор /usr/local/perl
2. Передать ему код своей perl-программы
3. Получить от него результат выполнения этой perl-программы
4. Вывести этот результат в stdout.
А как такое сделать через си на Unix?
я по моему написал как это сделать. или вы не читаете то что отвечают?
я по моему написал как это сделать. или вы не читаете то что отвечают?
Вы написали пример запуска perl-интерпритатора с передачей ему в качестве параметра пути до созданного заранее Perl-скрипта.
Но мне не нужно создавать на жестком диске файлов с Perl-скриптами.
Мне нужно из совей программы передать текст скрипта НАПРЯМУЮ и получить после этого так же НАПРЯМУЮ от интерпритаора Perl результат программы.
Вы написали пример запуска perl-интерпритатора с передачей ему в качестве параметра пути до созданного заранее Perl-скрипта.
так, читай внимательнее доки по fork и exec, могу ещё предложить заглянуть в `man 2 pipe'.
так, читай внимательнее доки по fork и exec, могу ещё предложить заглянуть в `man 2 pipe'.
Я читал, но ничего в man-ах не нашел... :(
- fork() создает процесс-потомок, который аналдогичен процессу-родителю. Через fork() я не могу вызвать стороннюю программу.
- pipe() делает возможность ввода/вывода между процессами, но этот ввов вывод возможет только после fork(). А как мне pipe() сделать для внешней программы, а не для копии самой себя?
- popen() открывает стороннюю программу, но устанавливает с ней только одностороннюю связь (чтение или запись), а мне нужна двусторонняя.
Что же делать-то? Где я не прав? В каких мануалах достать пример необходимой мне проги?
man 3 exec --- все exec* функции из libc, выбирай на вкус.
Нет,exec здесь не подходит, т.к. после exec'а моя программа уже не получит управление...
А мне же нужно выполнить стороннюю программу и после ее завершения получить в свою программу ее результат.
Нет,exec здесь не подходит, т.к. после exec'а моя программа уже не получит управление...
А мне же нужно выполнить стороннюю программу и после ее завершения получить в свою программу ее результат.
Ты просто тупишь или издеваешься?
Ты просто тупишь или издеваешься?
Скорее я туплю, чем издеваюсь... :)
Я прочитал документацию, там написано, что exec передает управление другой проге, замещает свой процесс ее процессом, что после exec'а моя программа ужене получит управление.
И еще, через exec можно вызвать программу с указанием параметров. Но как через exec открыть стороннюю прогу (интерпретатор перл), а уже потом передать ей какие-то данные на stdin, я не понимаю.
Если после exec процесс замещается, то такая передача получается невозможна.
Лучше бы пример привел, вот бы помог мне. Я уже этот вопрос на нескольких форумах обсуждаю, никто не может ничего дельного сказать :(
такие форумы. опишите толково задачу. я не вижу причин, по которым надо столь громоздкое решение юзать. это раз. почитайте не про один exec, если уж так не имется, а про fork+exec. кстати system в моем примере - делает именно то, что fork+exec. и кстати, что вам мешает доработать мой пример, генерируя файл скрипта в программе и передавая потом этот файл так как показано в примере. либо передавать параметры на лету.
Спасибо, я уже нашел на другом форуме ответ на свой вопрос. Если кому-то будет интересно, вот исходник. Здесь как раз используется fork и exec одновременно. Теперь мне стал понятен механизм использования данных функций в своей программе.
#include <stdlib.h>
#include <unistd.h>
int main() {
int p1[2], p2[2];
FILE *f1, *f2;
int i;
char line[80];
pipe(p1);
pipe(p2);
f1 = fdopen(p1[1], "w");
f2 = fdopen(p2[0], "r");
if (fork() == 0) {
dup2(p1[0], 0); // stdin
dup2(p2[1], 1); // stdout
close(p1[1]);
close(p2[0]);
execlp("/usr/local/bin/perl", "/usr/local/bin/perl", NULL);
} else {
close(p1[0]);
close(p2[1]);
}
// Я передаю интерпретатору Perl код: print 'Hello World!!!';
fprintf(f1, "print 'Hello World!!!!';");
fclose(f1);
// Я читаю результат
while (fgets(line, sizeof(line), f2) != NULL) {
printf("Итог выполнения Perl-программы: %s\n", line);
}
return 0;
}