2010-06-21 73 views
1

我有一個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()調用的代碼?

+4

正交,但使用-9作爲'kill'參數不是一個好主意,除非是在緊急情況下。您拒絕該流程有權執行任何可能需要的清理任務。 – Ether 2010-06-21 19:55:26

+1

$ pid的值是多少? – 2010-06-21 19:58:28

回答

0

here

的exit()函數並不總是立即退出。它首先調用任何已定義的END例程,但這些END例程本身可能不會中止退出。同樣,任何需要調用的對象析構函數都會在真正的出口之前被調用。

+0

那麼我怎麼才能讓它與所需的代碼一起退出,同時仍然要殺死孩子? – dromodel 2010-06-21 22:51:39

+0

無關緊要。因爲他發送'SIGKILL'('kill -9'),所以Perl進程被內核強行終止,並且不允許運行任何**關機或清理代碼。 ''exit'甚至沒有被調用 - 只要'SIGKILL'命中,在Perl代碼知道是什麼命中之前,這一切都結束了。 – 2010-06-22 09:40:15

相關問題