2014-02-08 77 views
0

我正在編寫一個Perl腳本來生成帶有文本的圖像。我在一臺Linux機器上。我正在使用pbmtextps。當我嘗試使用系統調用像這樣系統調用運行pbmtextps:ghostscript

system("pbmtextps -fontsize 24 SampleText > out.pbm"); 

我收到此錯誤信息

pbmtextps: failed to run Ghostscript process: rc=-1 

但是,如果我跑完全相同的pbmtextps運行在Perl pbmtextps在命令行以外的命令Perl,它運行時沒有錯誤。

爲什麼它會在Perl腳本中運行時導致ghostscript錯誤?

其他信息:我試圖通過創建一個名爲mypbmtextps.c的C代碼來解決此問題,該代碼與C系統調用完全相同。這從命令行起作用。沒有錯誤。但是當我從Perl腳本中調用該C程序時,我得到了相同的ghostscript錯誤。

回答:我解決了。問題是PERL腳本中的這一行: $ SIG {CHLD} ='IGNORE'; 當我擺脫那(我需要其他的東西,但不是在這個腳本)它運作良好。如果有人知道爲什麼會導致問題,請添加解釋。

+0

請注意,系統運行它在/ bin/sh中的參數。當你在外部運行'pbmtextps'命令時,你正在運行它(它是一個csh/tcsh)? – sateesh

+0

我在/ bin/sh,/ bin/csh和/ bin/tcsh中沒有任何錯誤地在外部運行命令。 –

回答

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))"})' 
+0

Perl腳本輸出錯誤。 –

0

你的Perl腳本是否修改了環境?

您可以

system("env > /tmp/env.perl"); 

測試,然後把它比作環境形成你的shell:

env > /tmp/env.shell 
diff /tmp/env.shell /tmp/env.perl 

是Perl腳本也正在從shell中運行,或者它正在從運行一些其他的過程,如cron或apache? (特別是你應該檢查$ PATH)

+0

我這樣做了,唯一的區別是env.perl有SHLVL = 2,而另一個有SHLVL = 1。另外,env.perl最後有這一行:_ =/usr/bin/env –

+0

接下來要看看STDIN/STDOUT是否對它有影響。嘗試使用 sh -c「pbmtextps -fontsize 24 SampleText> out.pbm/dev/null」 – dataless

+0

在原始消息中查看我的答案。 –