【问题标题】:Why am I getting an unexpected return code?为什么我会收到意外的返回码?
【发布时间】:2010-06-21 19:43:06
【问题描述】:

我有一个带有以下代码的 Perl 脚本。

...
$kill = 1;
$exit = 0;
`kill -9 $pid >& /dev/null`;
...
print "kill=$kill exit=$exit\n";
if ($kill) {
  exit $exit;
} else {
...

总之,这个脚本使用 open3() 来运行一个命令。在某些时候,它会终止作业,然后意图是脚本将以代码 0 退出。我插入了一个打印语句来显示变量 $kill$exit 的值,如下所示。

kill=1 exit=0

由于$kill 是1,我希望脚本以上面的代码0 退出,因为$exit 是0。但是,脚本以代码9 退出,这是发送给孩子的信号。为什么 Perl 脚本以子程序的退出代码退出,而不是提供给 exit() 调用的代码?

【问题讨论】:

  • 正交,但除非在最紧急的情况下,否则将 -9 用作 kill 参数并不是一个好主意。您拒绝进程执行任何可能需要的清理任务的权利。

标签: perl


【解决方案1】:

来自here

exit() 函数并不总是立即退出。它首先调用任何已定义的 END 例程,但这些 END 例程本身可能不会中止退出。同样,任何需要调用的对象析构函数都会在真正退出之前调用。

【讨论】:

  • 那么我怎样才能让它以所需的代码退出,同时仍然杀死孩子?
  • 无关紧要。因为他发送SIGKILL (kill -9),Perl 进程被内核强行终止,不允许运行any 关闭或清理代码。 exit 甚至没有被调用 - 只要 SIGKILL 命中,在 Perl 代码知道是什么命中它之前,一切都结束了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-31
  • 2019-06-14
  • 1970-01-01
  • 1970-01-01
  • 2013-08-11
相关资源
最近更新 更多