День добрый!
Вышла непонятная для меня заковырка.
Если мне нужно вызвать redirect.cgi, который в свою очередь должен
вызвать другой скрипт и перенаправить его вывод в stdout, то я к
примеру под шелом могу это проделать несколькими путями:
(FreeBSD 3.3., Apache 1.3.12 rus)
1. Используя popen и выдавая через буффер на stdout
2. Ипользуюя схему vfork -> dup2 -> execv; fdopen
3. Вызвав без форка exec.
При запуске redirect.cgi c WWW получаю на выходе содержимое
мусорного ящика...
По моему скромному разумению логика вызова у Апача не должна сильно
отличаться от логики shell (уже похоже ошибаюсь :))
Вообщем по идее это:
pipe(2)
|
vfork
/ \
child.cgi parent
| |
dup2 fdopen
| |
execv fgets
| |
printf("%s",) printf(buf)
| |
exit exit
В промежутках корректно закрываются все дескрипторы.
Открывается два пайпа.
На стороне child переопределяются stdout и stdin
parent - просто открывает каждый пайп через fdopen с соответствующими
флагами r,w
-----------------------------
Если я буду запускать CGI, то для него по схеме child будут
переопределены stdin и stdout.
Сам cgi у себя не переопределяет эти потоки.
Переопределяет их child от cgi, а в принципе, как в п.3. может и не
переопределять, так как они пронеслись от самого старшего родителя и
вывод попрет туда.
Дык вот из под апаче я получаю в каждом из трех случаев:
Content-type: text/html ELFL_OFFSET_TABLE_d_first_exception_table_matchя%\╓
hл┴ц▀яР┐Гь│ы@╓wс▀]ьЙГU┴еS╩L╓┐=L╓яяЙГU┴еjhщ▒jиэяяjяи■эяяU┴е▀U║p╔
и т.д.
Место сбоя приблизительно обнаружил.
Это чтение из дескриптора информации, которую child отдал в stdout.
В шеле это место работает, а в апаче нет. Как только включаю этот
кусок - "крошиться" весь остальной output cgi. :(
Буду благодарен тому, кто ткнет туда, где можно по данной
"проблеме" почитать или подскажет направление в котором надо искать
решение. :(
С уважением, Alexey V. Meledin <avm@xxxxxxxxxx>
InterForge Developers Group, St-Petersburg, Russia
---------------------------------------------------
> > > > > > "InterForge to Forge Ahead" < < < < < <
=============================================================================
= Apache-Talk@xxxxxxxxxxxxx mailing list =
Mail "unsubscribe apache-talk" to majordomo@xxxxxxxxxxxxx if you want to quit.
= Archive avaliable at http://www.lexa.ru/apache-talk =
"Russian Apache" includes software developed
by the Apache Group for use in the Apache HTTP server project
(http://www.apache.org/) See
Apache LICENSE.
Copyright (C) 1995-2001 The Apache Group. All rights reserved.
Copyright (C) 1996 Dm. Kryukov; Copyright (C)
1997-2009 Alex Tutubalin. Design (C) 1998 Max Smolev.