Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> задать переменную окружения вызываемой программе, как apache задает cgi-скриптам 
V
    Опции темы
chubaka
Дата 3.5.2008, 02:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 8.6.2007

Репутация: нет
Всего: нет



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

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

Спасибо. 

ЗЫ: Кидайте любыми комментами в тему, а то замудрил немного smile
PM MAIL   Вверх
Бонифаций
Дата 3.5.2008, 03:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 827
Регистрация: 15.9.2005
Где: Brisbane

Репутация: 1
Всего: 40



Код

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


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

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


--------------------
 Бонифаций.
 
PM MAIL ICQ Skype GTalk Jabber YIM   Вверх
MAKCim
Дата 3.5.2008, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



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

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
chubaka
Дата 3.5.2008, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 8.6.2007

Репутация: нет
Всего: нет



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

Код

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

PM MAIL   Вверх
MAKCim
Дата 3.5.2008, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



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

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
chubaka
Дата 3.5.2008, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 8.6.2007

Репутация: нет
Всего: нет



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

А можна пример ? 
PM MAIL   Вверх
MAKCim
Дата 3.5.2008, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



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

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

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

пример чего?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
chubaka
Дата 3.5.2008, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 8.6.2007

Репутация: нет
Всего: нет



Не код возврата, а поток вывода. Все что программа хотела вывести на экран.
PM MAIL   Вверх
MAKCim
Дата 3.5.2008, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



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

fread() над pipe


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
chubaka
Дата 3.5.2008, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 8.6.2007

Репутация: нет
Всего: нет



спасибо!
PM MAIL   Вверх
xvr
Дата 4.5.2008, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



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

Код

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

При popen'е вызываемая программа получит окружение текущей программы. Для изменения окружения текущей программы можно воспользоваться функцией setenv. Это ГОРАЗДО проще, чем вызывать через fork/execve и ловить вывод через pipe с сотоварищами  smile 
PM MAIL   Вверх
chubaka
Дата 4.5.2008, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 8.6.2007

Репутация: нет
Всего: нет



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

Код

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


верно ? 

Это сообщение отредактировал(а) chubaka - 4.5.2008, 18:06
PM MAIL   Вверх
xvr
Дата 4.5.2008, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



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

Код

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


верно ?

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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0554 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.