我正在嘗試使用Perl5到fork()
一個子進程。子進程應該exec()
另一個程序,將其STDIN
重定向到一個命名管道,並且STDOUT
和STDERR
來記錄文件。父進程繼續以循環方式運行,使用waitpid
並檢查$?
重新啓動子進程,以防其死於非零退出狀態。對於exec()
功能在exec()中重定向STDOUT和STDERR ...沒有shell
Perl文檔說:
如果在列表中有多個說法,這叫execvp(3)在列表中的參數。如果在LIST中只有一個元素,則檢查參數是否爲shell元字符,如果有,則將整個參數傳遞到系統的命令解析器(在Unix平臺上爲
/bin/sh -c
,但在其他平臺上有所不同)。如果參數中沒有shell元字符,它將被拆分爲單詞並直接傳遞給execvp
,這樣更有效。例子:exec '/bin/echo', 'Your arguments are: ', @ARGV; exec "sort $outfile | uniq";
這聽起來很酷,我想沒有一箇中介shell中運行我的外部程序,如以下示例所示。不幸的是,我無法將其與輸出重定向結合起來(如/bin/foo > /tmp/stdout
)。
換句話說,這不起作用:
exec ('/bin/ls', '/etc', '>/tmp/stdout');
所以,我的問題是:我怎麼重定向STD*
文件爲我的子命令,而無需使用的殼呢?