【发布时间】:2017-07-27 16:23:26
【问题描述】:
我正在尝试使用 Perl5 来 fork() 一个子进程。子进程应该exec() 另一个程序,将其STDIN 重定向到命名管道,并将STDOUT 和STDERR 重定向到日志文件。父进程继续循环运行,使用waitpid 并检查$? 以重新启动子进程,以防子进程以非零退出状态死亡。
exec() 函数的 Perl 文档说:
如果 LIST 中有多个参数,则使用 LIST 中的参数调用 execvp(3)。如果 LIST 中只有一个元素,则检查参数是否有 shell 元字符,如果有,则将整个参数传递给系统的命令 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' );
所以,我的问题是:如何在不使用 shell 的情况下为我的子命令重定向 STD* 文件?
【问题讨论】:
标签: perl exec stdout stdin stderr