系统调用运行pbmtextps:ghostscript

时间:2014-02-08 13:03:16

标签: perl

我正在编写一个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'; 当我摆脱它(我需要其他东西,但不是在这个脚本中)它工作正常。如果有人知道为什么会导致问题,请添加说明。

2 个答案:

答案 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))"})'