Perl   发布时间:2022-04-07  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在perl中重定向输出时fork exec kill的问题大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我在perl中创建了一个脚本来运行超时的程序.如果正在执行的程序需要更长的时间,那么超时将比脚本终止该程序并返回消息“TIMEOUT”.

脚本工作得很好,直到我决定重定向执行程序的输出.

当stdout和stderr被重定向时,脚本执行的程序没有被杀死,因为它的pid与我从fork获得的pid不同.

似乎perl执行一个shell,在重定向的情况下执行我的程序.

我想有输出重定向但仍能够在超时的情况下终止程序.

有关如何做到这一点的任何想法?

我的脚本的简化代码是:

#!/usr/bin/perl

use Strict;
use warnings;
use POSIX ":sys_wait_h";

my $timeout = 5;
my $cmd = "very_long_program 1>&2 > out.txt";

my $pid = fork();
if( $pid == 0 )
{
   exec($cmd) or print STDERR "Couldn't exec '$cmd': $!";
   exit(2);
}
my $time = 0;
my $kid = waitpid($pid,WNOHANG);
while ( $kid == 0 )
{
   sleep(1);
   $time ++;
   $kid = waitpid($pid,WNOHANG);
   print "Waited $time sec,result $kid\n";
   if ($timeout > 0 && $time > $timeout)
   {
      print "TIMEOUT!\n";
      #Kill process
      kill 9,$pid;
      exit(3);
   }
}

if ( $kid == -1)
{
   print "Process did not exist\n";
   exit(4);
}
print "Process exited with return code $?\n";
exit($?);

谢谢你的帮助.

解决方法

尝试更改$cmd @H_746_14@my $cmd = "very_long_program 1>&2 > out.txt";

@H_746_14@my $cmd = "exec very_long_program 1>&2 > out.txt";

exec将告诉sHell由perl生成的用very_long_program替换自己,而不是像孩子一样运行very_long_program.

(在这种情况下perl生成sHell的原因是因为$cmd包含重定向字符 – 而perl不知道如何自己处理它们.另一种解决问题的方法是在fork之后在perl中进行重定向( )但在调用exec()之前 – 但这有点棘手,所以首先尝试exec解决方法!)

大佬总结

以上是大佬教程为你收集整理的在perl中重定向输出时fork exec kill的问题全部内容,希望文章能够帮你解决在perl中重定向输出时fork exec kill的问题所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。