2014-05-23 2 views
0

Изнутри emperl, я пытаюсь вызвать wkhtmltopdf с модулем IPC :: Open3.embperl - Использование IPC :: Open3 для вызова wkhtmltopdf. STDIN Не работает

Я получаю выходные данные (спасибо ikegami) от wkhtmltopdf, но вход не будет в wkhtmltopdf.

Это связано с этим вопросом: perl/embperl — IPC::Open3

Вот код:

[- 
    use warnings; 
    use strict; 
    use IPC::Open3; 
    use POSIX; 
    use Symbol; 

    my $cmd = '/usr/local/bin/wkhtmltopdf - -'; 

    my $pdf = ''; 

    my $string = '<!DOCTYPE html> 
    <html> 
    <head> 
     <title>Hello World</title> 
    </head> 
    <body> 
     Hello World!!! 
    </body> 
    </html>'; 

    my $fhOUT = gensym(); 
    open($fhOUT, '>', '/dev/null') or die $!; 
    dup2(fileno($fhOUT), 1) or die $! if fileno($fhOUT) != 1; 
    local *STDOUT; 
    open(STDOUT, '>&=', 1) or die $!; 

    my $pid = open3(*HIS_IN, *HIS_OUT, *HIS_ERR, $cmd) or die "could not run cmd : $cmd : $!\n"; 

    print HIS_IN $string; 
    close(HIS_IN); 

    while(<HIS_OUT>) { 
    $pdf .= $_; 
    } 


    waitpid($pid, 0) or die "$!\n"; 
    my $retval = $?; 
    # print "retval-> $retval<br />\n"; 

    $http_headers_out{'Content-Type'}   = "application/pdf"; 
    $http_headers_out{'Content-Disposition'} = "attachment; filename=pdfTest.pdf"; 

    $escmode = 0; 
-] 
[+ $pdf +] 

ответ

0

Та же самая идея для STDIN, но Fd 0 вместо 1.

open(my $fhIN, '<', '/dev/null') or die $!; 
dup2(fileno($fhIN), 0) or die $! if fileno($fhIN) != 0; 
local *STDIN; open(STDIN, '<&=', 0) or die $!; 

open(my $fhOUT, '>', '/dev/null') or die $!; 
dup2(fileno($fhOUT), 1) or die $! if fileno($fhOUT) != 1; 
local *STDOUT; open(STDOUT, '>&=', 1) or die $!; 

my $pid = open3(
    local *HIS_IN, 
    local *HIS_OUT, 
    '>&STDERR', 
    $cmd 
); 

... 

Это предполагает ФО 0 и 1 замкнуты, как и здесь.

+0

Hello ikegami. Спасибо, что нашли время ответить. Кажется, что это работает, но теперь в списке процессов появляется ** несуществующий процесс **. 'apache 24480 24396 0 14:34? 00:00:00 [wkhtmltopdf] ' –

+0

Неиспользованный процесс - это тот, который не был использован (например, с помощью' wait' или 'waitpid'). – ikegami

+0

Я добавил waitpid, и он работает, когда я добавляю 'open (my $ fhIN, '<', '/ dev/null') или die $ !; dup2 (fileno ($ fhIN), 0) или умереть $! если fileno ($ fhIN)! = 0; местный * STDIN; open (STDIN, '<& =', 0) или die $ !; 'После этого я не могу выводить ничего через html. Он пишет файл в порядке, поэтому я знаю, что он работает, но я не могу писать в браузер. –

 Смежные вопросы

  • Нет связанных вопросов^_^