LINUX.ORG.RU

Добрый день, разрешите обратиться за помощью, короче, вот проблемма:

Собственно, есть бинарник на С++ , который должен вызвать скрипт на ПЕРЛ и передать ему некоторые входные параметры. После того как скрипт отработает, он должен передать свои Выходные параметры С++ бинарнику назад...

Объясните пожалуйста, как это сделать правильно, или хотя бы как это сделать.

Заранее большое спасибо!

anonymous
()
Ответ на: комментарий от anonymous

Могу посоветовать обратиться к книге Робачевского. Название не помню, что-то про UNIX (или программирования в UNIX). Там что-то близкое есть. Не про C++ - Perl конкретно, а про взаимодействие программ.

PS: Можно попробовать через переменную окружения, например.

kraw ★★★★
()
Ответ на: комментарий от anonymous

Кусок работаещего кода - через именованную дудку из проги данные 
заливаются в запускаемый скрипт, затем из нее читается результат

	// ------------------- ¦T¦++TãL+ ++¦ã¦ã+ L+T¦¦¦ ¦+¦¦+ --------
	
	int fd;

	fd = ::open( script.c_str(), O_RDONLY );

	if ( fd < 0 )
	    throw CommonException( ::strerror( errno ) );

	::close( fd );

	// ----------------- L&brvbar;--+L+ fifo ----------------------------
	
	::umask( 0 );
	if ( ::mknod( fifo_name.c_str(), S_IFIFO|0666, 0) !=0 )
	    throw CommonException( ::strerror( errno) );

	// ----------------- L&brvbar;&brvbar;T=&atilde;T&brvbar;++L+ T&brvbar;=++-- --------------------
	
	std::ostringstream cmd;
	cmd << script.c_str() << " --fifo=" << fifo_name << " 1>&2";

	// ------------------ -LL++&brvbar;+&atilde;L+ &brvbar;TT+T&brvbar;L&brvbar;&atilde;T L&atilde;&brvbar;++&brvbar;+ ---------------
	
	sigset_t	chldmask, savemask;

	::sigemptyset (&chldmask);
	::sigaddset (&chldmask, SIGCHLD);
	::sigprocmask (SIG_BLOCK, &chldmask, &savemask);
	::signal (SIGCHLD, child_sig_handler);

	pid_t	childpid;
	
	if((childpid = ::fork()) == -1)
	{
	    ::perror("fork");
	    ::exit(1);
	}

	if( childpid == 0 )
	{
	    /* Child process */
	    ::sigprocmask(SIG_SETMASK, &savemask, 0 );
	    
	    if ( ::execl( "/bin/sh", "sh" , "-c" , cmd.str().c_str(), 0 ) < 0 )
	    {
		::perror( "fork" );
		::_exit( 127 );
	    }
	} 

	/* Parent process */
	
	pid_t pid;
	while( 1 )
	{
	    ::sleep( 1 );
	    
	    if ( ( fd = ::open( fifo_name.c_str(), O_NONBLOCK | O_WRONLY )) < 0 )
	    {
		if ( errno == ENXIO )
		{
		    if ( pid = ::waitpid(-1,0, WNOHANG ) == 0 )
			continue;

		    ::sigprocmask(SIG_SETMASK, &savemask, 0 );
		    throw CommonException( "no child process!");
		}
		else
		{
		    int myerr = errno;
		    ::sigprocmask(SIG_SETMASK, &savemask, 0 );
		    throw CommonException( ::strerror( myerr ));
		}
	    }
	    else
	    {
		::sigprocmask(SIG_SETMASK, &savemask, 0 );
		break;
	    }
	} 

	FILE * fifo;
	// &brvbar;LTT-L+ fifo ++ -+&brvbar;&atilde;L+
	if ( (fifo = ::fdopen( fd, "w")) == 0 )
	{
	    int myerr = errno;
	    ::sigprocmask(SIG_SETMASK, &savemask, 0 );
	    throw CommonException( ::strerror( myerr ));
	}

	::fputs( xml.c_str(), fifo );
	::fclose( fifo );


	// &brvbar;LTT-L+ fifo ++ &brvbar;L++&atilde;+
	if ( (fifo = ::fopen( fifo_name.c_str(), "r")) == 0 )
	{
	    int myerr = errno;
	    ::sigprocmask(SIG_SETMASK, &savemask, 0 );
	    throw CommonException( ::strerror( myerr ));
	}
	char fb[1024];
	while( ::fgets( fb, 1024, fifo) )	source += fb;
	::fclose( fifo ); 

PETER ★★
()
Ответ на: комментарий от PETER

Спасибо большое за стольподробно изложение, и не мог лы ты сказать, что такое аргумент script в функции open в строке fd = ::open( script.c_str(), O_RDONLY );

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

И ещё, расскажи плз. почему в проге типа #include <iostream.h> ... cout<<"some str"; ... компиоятор ругается на cout и ostream и так далее, из этого хидера, хотя сам хидер и либа существует...

Спасибо в любом случаею

anonymous
()
Ответ на: комментарий от anonymous

>И ещё, расскажи плз. почему в проге типа #include <iostream.h> ... cout<<"some str"; ... компиоятор ругается на cout и ostream и так далее, из этого хидера, хотя сам хидер и либа существует...

Плюсовый код обычно собирают g++.

Ты небось gcc пытался компилять ;)?

sS ★★★★★
()
Ответ на: комментарий от anonymous

script объявлена как std::string,

потом надо делать #include <iostream> , если ничего не путаю,
иначе смотри доку на последнюю версию STL

еще обязательно указание namespaces:
std::cout << "some str" << std::endl например

PETER ★★
()
Ответ на: комментарий от anonymous

Вдогонку - найди Стивенса взаимодействие процессов, там все это подробно разбирается

PETER ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.