Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Perl中重写die,在Windows上仍然返回正确的退出代码_Perl - Fatal编程技术网

在Perl中重写die,在Windows上仍然返回正确的退出代码

在Perl中重写die,在Windows上仍然返回正确的退出代码,perl,Perl,在Windows上,我只想在脚本死亡时执行某些操作。 下面的街区没用;我想这是因为Windows不支持信号 $SIG{__DIE__} = sub { qx(taskkill /F /IM telnet.exe); CORE::die @_; } 然后我试了一下: END { qx(taskkill /F /IM telnet.exe); exit $exit_code; } 它执行了taskkill,但退出时退出代码为0。我需要传播exit\u code,因

在Windows上,我只想在脚本死亡时执行某些操作。 下面的街区没用;我想这是因为Windows不支持信号

$SIG{__DIE__} = sub {
    qx(taskkill /F /IM telnet.exe);
    CORE::die @_;
}
然后我试了一下:

END {
    qx(taskkill /F /IM telnet.exe);
    exit $exit_code;
}

它执行了
taskkill
,但退出时退出代码为0。我需要传播
exit\u code
,因为我们需要在此基础上进行进一步处理。

END
块可以设置
$?
来控制退出值

END {
      qx(taskkill /F /IM telnet.exe);
      $? = $exit_code;
}

$SIG{{uuuuu DIE}
不是真正的信号。它在所有平台上都能完美工作。它在抛出异常时被调用。但我确实看到它在Windows上不起作用,我使用Perl 5.18。什么在Windows上不起作用<代码>$SIG{{uuuuu DIE}?同样,它工作得很好。如果您尝试
perl-e“$SIG{{uu DIE{uuuu}=sub{warn('Foo:',@});exit(123);};DIE'bar'
,您将看到
Foo:
错误消息的前面,如果您使用
echo%ERRORLEVEL%
进行后续操作,您将看到
123
。感谢ikegami在这方面花时间提供帮助,正如我在上面的原始问题中提到的那样,我尝试了
$SIG{{uuuuu DIE}
,并在脚本中添加了一个“DIE”命令来验证,它没有执行
taskkill
不,真的,它可以工作。我已经证明了它是有效的。没有什么能阻止您在
\uuu DIE\uuu
处理程序中使用backticks
perl-e“$SIG{{uuu DIE}=sub{warn(`echo Foo`,@});exit(123);};DIE'bar'