2015-03-13 15 views
0

b.py子流程上SIGINT信號的反應不同

import subprocess 
f = subprocess.Popen(['python', 'a.py']) 
time.sleep(3000) 

a.py

import time 
time.sleep(1000) 

運行Python b.py,按CTRL + C,這兩個過程將終止。

但是,將信號SIGINT發送到父進程b.py,kill -2 xxxx,但子進程a.py仍然存在。

+0

是什麼讓你認爲CTRL-C作爲一個SIGINT來處理? – 2015-03-13 07:59:07

+0

錯字。 SIGINT。無論如何,我正在談論信號2 – user3201982 2015-03-13 08:01:38

+0

同樣的問題,是什麼讓你認爲CTRL-C是一個簡單的SIGINT?你在使用什麼操作系統? – 2015-03-13 08:05:22

回答

1

Ctrl-C在您的終端通常前臺進程組在發送SIGINT所有進程。你的父母和你的孩子進程都在這個進程組中。

如需更詳細的說明,請參見例如The TTY demystifiedProcess Groups and Sessions

更多的技術版本由Kirk McKusick如果你只是殺死父母的過程中,孩子是父母雙亡的孤兒因而被重設父以PID 1(在裏面)。你也可以在ps的輸出中看到。由於你的子過程從來沒有收到信號,它只是繼續運行。

+0

是的,那正是我需要的。我不在乎一個孤兒過程,我的最初目的是保持它即使父過程死亡也能運行。然後ctrl + c的問題來打擾我。看起來我必須在前臺過程中捕獲這些信號。 – user3201982 2015-03-13 08:51:45

+0

我想你想要的是*守護*孩子。實際上有一個PEP:https://www.python.org/dev/peps/pep-3143/ – dhke 2015-03-13 08:55:34

+0

這個文件太複雜了,我不明白。我可以使用subprocess.Popen來運行一個新的進程嗎?當然,將preexec_fn參數設置爲os.setsid(),以便使子進程與父進程組分離。 – user3201982 2015-03-13 09:35:53