Russian Apache Switch to English
Switch to Russian koi8-r
windows=1251
cp-866
iso8859-5
Russian Apache Как это работает Рекоммендации Где взять Как установить Как настроить Статус и поддержка
Краткий обзор FAQ Список рассылки Благодарности Поиск по серверу Powered by Russian Apache
Russian Apache mailing list archive (apache-rus@lists.lexa.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[apache-talk] Работа с pipe для CGI



День добрый!

  Вышла непонятная для меня заковырка.
  Если мне нужно вызвать 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 ] [ Как это работает ] [ Рекомендации ] [ Где взять ] [ Как установить ] [ Как настроить ] [ Статус и поддержка ] [ Краткий обзор ] [ FAQ ] [ Список рассылки ] [ Благодарности ] [ Поиск по серверу ] [ Powered by Russian Apache ] [ Apache-talk archive ]

"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.