The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Как организовать взаимодействие C и Perl ?"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Как организовать взаимодействие C и Perl ?"
Сообщение от hlt emailИскать по авторуВ закладки on 26-Окт-02, 01:21  (MSK)
есть char *body; в котором находится некоторый текст,
как можно передать его Perl программе, которая изменит его
определенным образом, а затем получить обратно ?
т.е.
на входе один body, на выходе другой.
  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "RE: Как организовать взаимодействие C и Perl ?"
Сообщение от serg emailИскать по авторуВ закладки on 28-Окт-02, 09:51  (MSK)
>есть char *body; в котором находится некоторый текст,
>как можно передать его Perl программе, которая изменит его
>определенным образом, а затем получить обратно ?
>т.е.
>на входе один body, на выходе другой.
Для запуска перл программы из C необходимо:
1. иницилизироать Перл интерпретатор
2. скомпилировать программу Перла
3. иницилизировать переменные для Перла
4. запустить перл процедуру
5. получить данные из Перла
Существует несколько спсобов запуска перл из C один из них приведен ниже
для компиляции используй строку:
gcc -c prog.c `perl -MExtUtils::Embed -e ccopts`
для компановки
gcc -o prog prog.o `perl -MExtUtils::Embed -e ldopts`


#include <EXTERN.h>
#include <perl.h>


static PerlInterpreter *perl;


int main(int num,char *arg[])
{
    char *argv[2];
    char *body;
//  подготовка интерпретатора
    SV *PerlVar;
    perl=perl_alloc();
    perl_construct(perl);
    argv[0]=arg[0]; argv[1]=PerlName;
    perl_parse(perl, NULL, 2,argv,(char **)NULL);
    PerlVar=get_sv("BODY",TRUE);  // создать переменную видимую в перле как $BODY
    sv_setpv(PerlVar,body);       // передать переменной $BODY значение

//
// ВЫЗОВ ФУНКЦИИ
//

// подготовка стека
    dSP; ENTER; PUSHMARK(SP);
// загрузка данных
    PUSHs(sv_2mortal(newSVpv((char *)body,strlen(body))));
    PUTBACK;
// вызов процедуры
    call_pv(name,G_SCALAR);
//    возврат данных
    SPAGAIN; PerlVar =POPs; LEAVE;

// получение данных из переменной
   *res = SvPVnolen(PerlVar);
// завершение использования Перла
    perl_free(perl);
    exit(0);
}
(для более подробной информации см. Perlembed)

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "RE: Как организовать взаимодействие C и Perl ?"
Сообщение от hlt emailИскать по авторуВ закладки on 28-Окт-02, 11:10  (MSK)
Всем спасибо вопрос снят
я сделал так:


char *exargs[] = {"/usr/bin/perl","/usr/homes/kyprizel/apache/script.pl",NULL};
int fds[2];                                                      
pid_t mypid;
char mybuf[1024];
char *body;
FILE *FD;

pipe(fds);
mypid = fork();
if(mypid == (pid_t)0)
  {
  close(fds[0]);            
  dup2(fds[1],STDOUT_FILENO);
  execv(exargs[0],exargs);  
  exit(1);                  
  }
close(fds[1]);
wait(NULL);
read(fds[0],mybuf,sizeof(mybuf));                
close(fds[0]);

в итогде mybuf имеем stdout perl'а

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру