2013-05-12 40 views
1

我抓到一個CtrlC做一個清理是更正確的退出程序kill('INT', $$)比退出程序exit()如何在獲取Ctrl + C後退出?

+0

是什麼給了你這個想法?爲什麼要這樣「更正確」? – innaM 2013-05-12 11:49:06

+0

因爲迄今爲止據我所知,這就是Ctrl + C如果我沒有抓到它會做的。 – 2013-05-12 13:50:43

回答

4

按Ctrl - ç發送INT信號到你的過程。處理,經過發送另一個INT是沒用的:

perl -E'$SIG{INT}=sub{say "interrupted"; $c++ < 5 and kill INT => $$}; <>' 

這是貫徹落實遞歸 goto的一種不尋常的方式,但沒有^C ^C ^C量將終止程序。 (按回車鍵退出)。

如果你想exit該程序,做到這一點(最好具有非零狀態)。


perlmod相關報價:

END代碼塊儘可能晚地執行,也就是說,perl的運行完畢的程序和之前的解釋正在退出,即使後它由於die()函數而退出。 (但如果它是通過exec變形到另一個程序,或由被吹出來的水的信號,你有陷阱,自己(如果可以的話)。

即自中斷kill INT => $$不會執行END默認情況下,這可能源自「讓困難的事情成爲可能」的理念,除非某些退出操作需要很長時間才能運行,您仍然應該在INTTERM信號上執行它們,如果用戶立即關機, KILL

+0

在kill('INT',$$)'之前,我會將$ SIG {INT}設置回「DEFAULT」。 – 2013-05-12 12:38:21

+1

@sid_com好的,在這種情況下,關鍵是你是否想要運行'END'塊。沒有幾個理由,所以'出口'仍然是可取的。 – amon 2013-05-12 13:00:11