Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > задать переменную окружения вызываемой программе


Автор: chubaka 3.5.2008, 02:47
Разрабатывается fastcgi программа, которая является посредником между web-сервером и cgi-приложением. Как передать все переменные откружения (DOCUMENT_ROOM и т.д) программе cgi-скрипту, который буду вызывать.

Другими словами: как передать переменные окружения вызываемой программе, чтобы она их получила с помощью getenv или как там их получают cgi-скрипты.

Спасибо. 

ЗЫ: Кидайте любыми комментами в тему, а то замудрил немного smile

Автор: Бонифаций 3.5.2008, 03:09
Код

 execve(char *path,  char *argv[], char *envp[]);


Аргумент envp - это "окружение" программы. Если он не задан - передается окружение текущей программы.

Так что вам нужен fork +execve

Автор: MAKCim 3.5.2008, 09:02
Цитата(Бонифаций @  3.5.2008,  03:09 Найти цитируемый пост)
Если он не задан - передается окружение текущей программы.

нет
ты путаешь с библиотечными обертками execl()/execlp()/execle()/execv()/execvp(), которые определяют дополнительную функциональность
execve() определяет прямой вызов системного сервиса sys_execve() без дополнительных проверок и пр.

Автор: chubaka 3.5.2008, 09:13
А как можна будет сохранить результат выполнения вызываемой программы с помощью execve, если сейчас я его popen'ом сохраняю ? 

Код

FILE * pipe = popen("/home/soft.cgi", "r");
/* ... */

Автор: MAKCim 3.5.2008, 09:26
Цитата(chubaka @  3.5.2008,  09:13 Найти цитируемый пост)
А как можна будет сохранить результат выполнения вызываемой программы с помощью execve

если ты о коде возврата в main() или о параметре, передаваемом в _exit()/exit(), то через wait() в родительском процессе
через popen() ты получишь вывод программы на stdout

Автор: chubaka 3.5.2008, 09:58
О коде возврата. Ну да, насколько я понимаю это stdout. Тоесть то что программа в процессе работы на экран выводит.

А можна пример ? 

Автор: MAKCim 3.5.2008, 10:27
Цитата(chubaka @  3.5.2008,  09:58 Найти цитируемый пост)
Ну да, насколько я понимаю это stdout

это не stdout
я же специально спросил, что ты имел в виду
код возврата - это целочисленное значение (возвращаемое в том числе посредством return в main())

Цитата(chubaka @  3.5.2008,  09:58 Найти цитируемый пост)
А можна пример ?  

пример чего?

Автор: chubaka 3.5.2008, 10:39
Не код возврата, а поток вывода. Все что программа хотела вывести на экран.

Автор: MAKCim 3.5.2008, 15:31
Цитата(chubaka @  3.5.2008,  10:39 Найти цитируемый пост)
Не код возврата, а поток вывода. Все что программа хотела вывести на экран. 

fread() над pipe

Автор: chubaka 3.5.2008, 17:54
спасибо!

Автор: xvr 4.5.2008, 15:06
Цитата(chubaka @ 3.5.2008,  09:13)
А как можна будет сохранить результат выполнения вызываемой программы с помощью execve, если сейчас я его popen'ом сохраняю ? 

Код

FILE * pipe = popen("/home/soft.cgi", "r");
/* ... */

При popen'е вызываемая программа получит окружение текущей программы. Для изменения окружения текущей программы можно воспользоваться функцией setenv. Это ГОРАЗДО проще, чем вызывать через fork/execve и ловить вывод через pipe с сотоварищами  smile 

Автор: chubaka 4.5.2008, 18:05
xvr, дык мне вызываемой программе нужно передать также argv. Хотя конечно заставили задуматься. argv можна передать и так:

Код

FILE * pipe = popen("/home/soft.cgi data1 data2", "r");


верно ? 

Автор: xvr 4.5.2008, 18:58
Цитата(chubaka @ 4.5.2008,  18:05)
xvr, дык мне вызываемой программе нужно передать также argv. Хотя конечно заставили задуматься. argv можна передать и так:

Код

FILE * pipe = popen("/home/soft.cgi data1 data2", "r");


верно ?

Именно, однако надо не забыть правильно заэскейпить эти argv, если там будут какие нибудь нехорошие символы (типа пробелов и пр)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)