Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
embperl-使用IPC::Open3调用wkhtmltopdf。STDIN不工作_Perl_Stdin_Wkhtmltopdf_Embperl_Ipcopen3 - Fatal编程技术网

embperl-使用IPC::Open3调用wkhtmltopdf。STDIN不工作

embperl-使用IPC::Open3调用wkhtmltopdf。STDIN不工作,perl,stdin,wkhtmltopdf,embperl,ipcopen3,Perl,Stdin,Wkhtmltopdf,Embperl,Ipcopen3,在embperl中,我尝试使用IPC::Open3模块调用wkhtmltopdf 我从wkhtmltopdf获得输出(感谢),但没有输入到wkhtmltopdf 这与这个问题有关: 代码如下: [- use warnings; use strict; use IPC::Open3; use POSIX; use Symbol; my $cmd = '/usr/local/bin/wkhtmltopdf - -'; my $pdf = ''; my $stri

在embperl中,我尝试使用IPC::Open3模块调用wkhtmltopdf

我从wkhtmltopdf获得输出(感谢),但没有输入到wkhtmltopdf

这与这个问题有关:

代码如下:

[-
  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 +]
[-
使用警告;
严格使用;
使用IPC::Open3;
使用POSIX;
使用符号;
my$cmd='/usr/local/bin/wkhtmltopdf---';
我的$pdf='';
我的$string
你好,世界
你好,世界!!!
';
my$fhOUT=gensym();
打开($fhOUT,'>','/dev/null')或死亡$!;
dup2(fileno($fhOUT),1)或die$!如果fileno($fhOUT)!=1;
本地*STDOUT;
打开(标准符号“>&=”,1)或死亡$!;
my$pid=open3(*HIS_IN、*HIS_OUT、*HIS_ERR、$cmd)或die“无法运行cmd:$cmd:$!\n”;
在$string中打印他的_;
关闭(他的房间);
而(){
$pdf.=$\;
}
waitpid($pid,0)或死“$!\n”;
my$retval=$?;
#打印“retval->$retval
\n”; $http_headers_out{'Content-Type'}=“application/pdf”; $http_headers_out{'Content-Disposition'}=“附件;filename=pdfTest.pdf”; $escmode=0; -] [+$pdf+]
标准输入法也有同样的想法,但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
 );

 ...
open(我的$fhIN,&=',1)或die$!;
我的$pid=open3(
当地人,他在,
当地的,他的,
“>&STDERR”,
$cmd
);
...

这假设fd 0和1关闭,这里就是这样。

Hello ikegami。感谢您抽出时间回答。它似乎可以工作,但现在有一个不存在的进程出现在进程列表中<代码>apache 24480 24396 0 14:34?00:00:00[wkhtmltopdf]一个失效的进程是一个尚未收获的进程(例如使用
wait
waitpid
)。我添加了waitpid,它在添加
open时工作(我的$fhIN,'您有一个系统,文件句柄和文件描述符严重混乱。看起来我们破坏了您用于输出的文件描述符,因此您需要对其进行备份。在完成open3()部分后,如何取消破坏文件描述符/句柄?