Как перенаправить мой STDOUT с HTTP :: Server :: Simple? - PullRequest
1 голос
/ 24 марта 2011

Я использую HTTP :: Server :: Simple :: CGI для написания простого веб-сервера. В моем обработчике я должен запустить процесс, который печатает что-то в STDOUT. Я хочу, чтобы STDOUT был перенаправлен на клиент, а не на консоль.

Это мой обработчик

sub serve_content {
     $| =  undef;
     my $cgi  = shift;
     print $cgi->header('image/png');
     IPC::Run::run ['/usr/bin/myapp', '-o', '/dev/fd/3'], '3>&1', '1>&2', '>', *STDOUT;
 }

Это выводит вывод приложения на консоль, а не клиенту, который сделал http-запрос. Как мне перенаправить его?

Ответы [ 2 ]

0 голосов
/ 24 марта 2011

Интересно, действительно ли вам нужен IPC :: Run, я не уверен, что он дает вам какие-то реальные преимущества.

Почему бы просто не открыть скрипт с каналом, читать из канала по блокам,и отправлять каждый блок в браузер?Что-то вроде:

open my $pipe, '/usr/bin/myapp|';
binmode $pipe;
local $/ = \4096;
while(<$pipe>) {
    print;
}

Если файл изображения достаточно мал, чтобы сохранить его в памяти сразу, вы также можете использовать обратные метки.

 print `/usr/bin/myapp`;
0 голосов
/ 24 марта 2011

Порядок перенаправлений имеет значение. Перенаправляя 3 на 1 и 1 на 2, эффективно перенаправляет 3 на 2. Попробуйте:

IPC::Run::run ['/usr/bin/myapp', '-o', '/dev/fd/3'], , '1>&2', '3>&1', '>', *STDOUT;

Или может быть

IPC::Run::run ['/usr/bin/myapp', '-o', '/dev/fd/3'], , '1>&2', '3>', *STDOUT;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...