embperl-使用IPC::Open3调用wkhtmltopdf。STDIN不工作
在embperl中,我尝试使用IPC::Open3模块调用wkhtmltopdf 我从wkhtmltopdf获得输出(感谢),但没有输入到wkhtmltopdf 这与这个问题有关: 代码如下: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
[-
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()部分后,如何取消破坏文件描述符/句柄?