我正在尝试使用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*
文件为我的子命令,而无需使用的壳呢?