終止一個進程有很多方法(暫只說linux環境):前臺運行的進程,如果沒有提供退出功能,我們通常會Ctrl+C進行終止;後臺或守護進程,如果也沒有提供退出命令啥的,咱通常會kill掉;此外還有類似關機或重啟之類的特殊情況,也會導致進程終止。 無論哪種方法,最終都是通過向進程傳遞信號量的方式進行終止。只 ...
終止一個進程有很多方法(暫只說linux環境):前臺運行的進程,如果沒有提供退出功能,我們通常會Ctrl+C進行終止;後臺或守護進程,如果也沒有提供退出命令啥的,咱通常會kill掉;此外還有類似關機或重啟之類的特殊情況,也會導致進程終止。
無論哪種方法,最終都是通過向進程傳遞信號量的方式進行終止。只是不同的方式發送的信號也不同:比如Ctrl+C發送的是SIGINT,kill和killall發送的是SIGTERM,kill -9發送的是SIGKILL,等等。
有些信號可以在程式中捕獲,針對進行特殊處理;而有些則手動捕獲不了或不能忽略,只能服從命令。
對於那些可以捕獲到的終止類信號(如SIGTERM、SIGHUP、SIGINT等),就如同家長向正在玩仙劍的孩子說道:“玩兒一下午了,別玩了。”
如果碰到頑皮的,那麼很可能就當作耳邊風了——捕獲到信號後選擇不終止進程;
如果孩子還算聽話,那麼就趕緊把游戲存個檔退出了——捕獲到信號後做好收尾工作,然後終止進程(安全退出,推薦);
有的則圖省事直接退出——不捕獲信號或不做特殊處理,直接終止進程(大部分人都這麼做,不推薦);
如果碰到的是個嚴厲的家長,二話不說直接上前把游戲關掉,這下孩子傻眼了“我擦,還沒存檔!!!”——接收到了不可被忽略的終止信號
另外還有一點需要註意,針對關機和重啟的情況,是由操作系統按PID正序逐個發送SIGTERM,通知大家“做好準備,要關機了”,隨後(n秒後)會下最後通諜——SIGKILL。對於子進程來說,父進程由於PID小,會先收到SIGTERM,收到後會立即向子進程發SIGKILL結束子進程。這樣很可能會造成子進程接收不到操作系統發的SIGTERM,還未進行收尾工作就被終止。所以,還是儘量在主進程做收尾工作,或者主進程收到SIGTERM後主動向子進程發送SIGTERM(僅僅是這麼想的,未驗證 -.-)。
---------------------------------------------------分割線------------------------------------------------------------
附錄:
網上的一段示例代碼(Python)
#!/usr/bin/env python import time import signal import sys NEEDEXIT=False def SignalHandler(sig, id): global NEEDEXIT if sig == signal.SIGUSR1: print 'received signal USR1' elif sig == signal.SIGHUP: print 'received signal HUP' elif sig == signal.SIGTERM: print 'received SIGTERM, shutting down' NEEDEXIT = True signal.signal(signal.SIGUSR1, SignalHandler) signal.signal(signal.SIGHUP, SignalHandler) signal.signal(signal.SIGTERM, SignalHandler) while 1: if NEEDEXIT: sys.exit() time.sleep(1)