Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вызов внешней программы

6.1K
05 мая 2006 года
Flex25
50 / / 14.03.2006
Нужно в Unix из программы C++ вызвать интерпретатор Perl (/usr/local/perl), передать ему программный код на языке Perl и получить результат выполенения Perl-программы.

Как это можно сделать? Это вроде через переключение потоков делается, но нигде не могу инфы по этому найти :(
386
05 мая 2006 года
newcss
297 / / 05.04.2005
Цитата:
Originally posted by Flex25
Нужно в Unix из программы C++ вызвать интерпретатор Perl (/usr/local/perl), передать ему программный код на языке Perl и получить результат выполенения Perl-программы.

Как это можно сделать? Это вроде через переключение потоков делается, но нигде не могу инфы по этому найти :(



хм.... незнаю как в юникс, но в винде в билдере для этого есть функция exec, про нее почитай

2
05 мая 2006 года
squirL
5.6K / / 13.08.2003
Цитата:
Originally posted by newcss
хм.... незнаю как в юникс, но в винде в билдере для этого есть функция exec, про нее почитай



в UNIX она тоже есть :)
решение задачи зависит от того, что именно надо сделать. если просто вызвать интерпретатор и передать ему фиксированный скрипт, то проще всего использовать функцию system(3). Например, перловый код следующий:

 
Код:
#!/usr/bin/perl

print "Hello World!\n";


программа на С будет выглядеть так:

 
Код:
#include <stdlib.h>

int main()
{
  system("/usr/bin/perl /home/squirl/perlcode/helloworld.pl");

  return 0;
}


если же надо что то более сложное, нужно использовать связку fork+exec в явном виде.
man 3 exec
man 2 fork
12K
05 мая 2006 года
rgo
11 / / 02.07.2005
Цитата:
Originally posted by Flex25
Нужно в Unix из программы C++ вызвать интерпретатор Perl (/usr/local/perl), передать ему программный код на языке Perl и получить результат выполенения Perl-программы.

Как это можно сделать? Это вроде через переключение потоков делается, но нигде не могу инфы по этому найти :(


man popen

6.1K
06 мая 2006 года
Flex25
50 / / 14.03.2006
Цитата:
Originally posted by rgo
man popen



popen может быть открыт только для чтения ИЛИ записи (а не одновреиенно для чтения и записи), поэтому не смогу с помощью popen сначала записать, а потом сразу же прочитать данные из /usr/local/perl.

Мне же нужно сделать следующее (по порядку):
1. Открыть через вою прогу интерпретатор /usr/local/perl
2. Передать ему код своей perl-программы
3. Получить от него результат выполнения этой perl-программы
4. Вывести этот результат в stdout.

А как такое сделать через си на Unix?

2
06 мая 2006 года
squirL
5.6K / / 13.08.2003
Цитата:
Originally posted by Flex25
popen может быть открыт только для чтения ИЛИ записи (а не одновреиенно для чтения и записи), поэтому не смогу с помощью popen сначала записать, а потом сразу же прочитать данные из /usr/local/perl.

Мне же нужно сделать следующее (по порядку):
1. Открыть через вою прогу интерпретатор /usr/local/perl
2. Передать ему код своей perl-программы
3. Получить от него результат выполнения этой perl-программы
4. Вывести этот результат в stdout.

А как такое сделать через си на Unix?


я по моему написал как это сделать. или вы не читаете то что отвечают?

6.1K
10 мая 2006 года
Flex25
50 / / 14.03.2006
Цитата:
Originally posted by squirL
я по моему написал как это сделать. или вы не читаете то что отвечают?


Вы написали пример запуска perl-интерпритатора с передачей ему в качестве параметра пути до созданного заранее Perl-скрипта.

Но мне не нужно создавать на жестком диске файлов с Perl-скриптами.

Мне нужно из совей программы передать текст скрипта НАПРЯМУЮ и получить после этого так же НАПРЯМУЮ от интерпритаора Perl результат программы.

12K
10 мая 2006 года
rgo
11 / / 02.07.2005
Цитата:
Originally posted by Flex25
Вы написали пример запуска perl-интерпритатора с передачей ему в качестве параметра пути до созданного заранее Perl-скрипта.


так, читай внимательнее доки по fork и exec, могу ещё предложить заглянуть в `man 2 pipe'.

6.1K
10 мая 2006 года
Flex25
50 / / 14.03.2006
Цитата:
Originally posted by rgo
так, читай внимательнее доки по fork и exec, могу ещё предложить заглянуть в `man 2 pipe'.


Я читал, но ничего в man-ах не нашел... :(

- fork() создает процесс-потомок, который аналдогичен процессу-родителю. Через fork() я не могу вызвать стороннюю программу.
- pipe() делает возможность ввода/вывода между процессами, но этот ввов вывод возможет только после fork(). А как мне pipe() сделать для внешней программы, а не для копии самой себя?
- popen() открывает стороннюю программу, но устанавливает с ней только одностороннюю связь (чтение или запись), а мне нужна двусторонняя.

Что же делать-то? Где я не прав? В каких мануалах достать пример необходимой мне проги?

12K
11 мая 2006 года
rgo
11 / / 02.07.2005
> читай внимательнее доки по exec

man 3 exec --- все exec* функции из libc, выбирай на вкус.
6.1K
11 мая 2006 года
Flex25
50 / / 14.03.2006
Цитата:
все exec* функции из libc, выбирай на вкус.


Нет,exec здесь не подходит, т.к. после exec'а моя программа уже не получит управление...

А мне же нужно выполнить стороннюю программу и после ее завершения получить в свою программу ее результат.

12K
11 мая 2006 года
rgo
11 / / 02.07.2005
Цитата:
Originally posted by Flex25
Нет,exec здесь не подходит, т.к. после exec'а моя программа уже не получит управление...

А мне же нужно выполнить стороннюю программу и после ее завершения получить в свою программу ее результат.


Ты просто тупишь или издеваешься?

6.1K
11 мая 2006 года
Flex25
50 / / 14.03.2006
Цитата:
Originally posted by rgo
Ты просто тупишь или издеваешься?


Скорее я туплю, чем издеваюсь... :)

Я прочитал документацию, там написано, что exec передает управление другой проге, замещает свой процесс ее процессом, что после exec'а моя программа ужене получит управление.

И еще, через exec можно вызвать программу с указанием параметров. Но как через exec открыть стороннюю прогу (интерпретатор перл), а уже потом передать ей какие-то данные на stdin, я не понимаю.

Если после exec процесс замещается, то такая передача получается невозможна.

Лучше бы пример привел, вот бы помог мне. Я уже этот вопрос на нескольких форумах обсуждаю, никто не может ничего дельного сказать :(

2
12 мая 2006 года
squirL
5.6K / / 13.08.2003
такие форумы. опишите толково задачу. я не вижу причин, по которым надо столь громоздкое решение юзать. это раз. почитайте не про один exec, если уж так не имется, а про fork+exec. кстати system в моем примере - делает именно то, что fork+exec. и кстати, что вам мешает доработать мой пример, генерируя файл скрипта в программе и передавая потом этот файл так как показано в примере. либо передавать параметры на лету.
6.1K
12 мая 2006 года
Flex25
50 / / 14.03.2006
Цитата:
Originally posted by squirL
такие форумы. опишите толково задачу. я не вижу причин, по которым надо столь громоздкое решение юзать. это раз. почитайте не про один exec, если уж так не имется, а про fork+exec. кстати system в моем примере - делает именно то, что fork+exec. и кстати, что вам мешает доработать мой пример, генерируя файл скрипта в программе и передавая потом этот файл так как показано в примере. либо передавать параметры на лету.



Спасибо, я уже нашел на другом форуме ответ на свой вопрос. Если кому-то будет интересно, вот исходник. Здесь как раз используется fork и exec одновременно. Теперь мне стал понятен механизм использования данных функций в своей программе.

Код:
#include <stdio.h>
#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;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог