我正在编写一个Perl脚本来生成包含文本的图像。我在Linux机器上。我正在使用pbmtextps
。当我尝试使用像这样的系统调用在Perl中运行pbmtextps时
system("pbmtextps -fontsize 24 SampleText > out.pbm");
我收到此错误消息
pbmtextps: failed to run Ghostscript process: rc=-1
但是,如果我从Perl之外的命令行运行完全相同的pbmtextps命令,它运行时没有错误。
为什么在从Perl脚本中运行时会导致ghostscript错误?
附加信息:我试图通过创建一个名为mypbmtextps.c的C代码来解决这个问题,它与C系统调用完全相同。这可以从命令行工作。没有错误。但是当我从Perl脚本调用该C程序时,我得到了相同的ghostscript错误。
答案:我解决了。问题是PERL脚本中的这一行: $ SIG {CHLD} ='IGNORE'; 当我摆脱它(我需要其他东西,但不是在这个脚本中)它工作正常。如果有人知道为什么会导致问题,请添加说明。答案 0 :(得分:0)
你的perl脚本是否修改了环境?
您可以使用
进行测试system("env > /tmp/env.perl");
然后将它与shell的环境进行比较:
env > /tmp/env.shell
diff /tmp/env.shell /tmp/env.perl
perl脚本是否也是从shell运行的,还是从cron或apache等其他进程运行? (特别是,你应该检查$ PATH)
答案 1 :(得分:0)
阿公顷。好吧,wait()需要SIGCHLD,因此perl需要能够检索system()创建的子进程的退出状态。特别是,当忽略SIGCHLD时,system()始终返回-1。 $? SIGCHLD被阻止也无法使用。
打印错误信息的内容是什么? pbmtextps,还是你的perl脚本?
据我所知,perl进程的信号处理程序不应该影响子进程的信号处理程序,但这可能取决于你的perl版本和你的操作系统版本。在我使用Perl 5.14.2的Linux Mint 13上,内部perl脚本打印0,外部脚本打印-1:
perl -e '$SIG{CHLD}= "IGNORE"; print system(q{perl -e "print system(q(/bin/sleep 1))"})'