2016-06-29 9 views
0

私は2つのPythonスクリプトfoo.pybar.pyを持っています。foo.pyは、os.system()bar.pyを呼び出します。PythonでシグナルとKeyboardInterruptはどのように処理されますか?

#foo.py 
import os 

print os.getpid() 
os.system("python dir/bar.py") 
#bar.py 
import time 

time.sleep(10) 
print "over" 

プログラムが正常に終了した場合foo.pyのpidは、123であると言う、それが実行している間、私はkill 123入力した場合、私は買ってあげる

123 
over 

を印刷します次の出力

123 
Terminated 
over 

0を押すとCtrlキー - C、それが実行している間、私は

123 
^CTraceback (most recent call last): 
    File "dir/bar.py", line 4, in <module> 
    time.sleep(10) 
KeyboardInterrupt 

ような何かを得るでしょう。しかし、それは実行している間、私はkill -SIGINT 123入力すると、プログラムだけで正常に信号および終了を無視するようです。

123 
over 

私がkill 123を入力すると、サブプロセスが影響されることはありません
、と私には思えます。
Ctrl - Cと入力すると、両方のプロセスが終了します。
サブプロセスの実行中にkill -SIGINT 123と入力すると、シグナルは無視されます。

誰かが私にその動作を説明してもらえますか?
Ctrl - kill -SIGINTは同等であると思われますか?
kill 123と入力すると、サブプロセスが影響を受けないことが保証されますか?

私はUbuntu 14.04を途中で使っています。ありがとう!

答えて

1

はのは、順番にそれぞれのケースを考えてみましょう:

私はkill 123を入力すると、サブプロセスが影響を受けることはありません。

はい、そうです。kill [pid]です。これは、殺すプロセスにのみシグナルを送ります。シグナルをプロセスのグループに送信する場合は、process groupを表す負の数を使用する必要があります。

Ctrl-Cと入力すると、両方のプロセスが終了します。

「Ctrl-Cで終了しました」と思われます。実際にはそうではありません。子供だけが解雇されます。foo.pyの最後にprint "I'm a little teapot"のような行を追加すると、この行が表示されます。何が起こるかは、子供が信号を得ることです。その後、親はos.systemから続きます。追加行がなければ、のように見えますが、親はCtrl-Cの影響を受けていましたが、追加の行が示すように、そうではありません。

シェルは、ttyに関連付けられているプロセスグループに信号を送信します。には、の親が含まれています。 ただし、の場合、os.systemsystemコールを使用し、コールを行うプロセスではSIGINTおよびSIGQUITシグナルをブロックします。だから親は免疫です。

os.systemを使用しない場合は、を入力してからを入力してください。処理はSIGINTの影響を受けます。 foo.pyためにこのコードを試してみてください。

import os 
import subprocess 

print os.getpid() 
p = subprocess.Popen(["python", "dir/bar.py"]) 
p.wait() 
print "I'm a little teapot" 

にCtrl-Cをヒットした場合、これは実行中に、次の2つのトレースバック取得します:場合

$ python foo.py 
29626 
^CTraceback (most recent call last): 
    File "dir/bar.py", line 4, in <module> 
Traceback (most recent call last): 
    File "foo.py", line 8, in <module> 
    time.sleep(10) 
KeyboardInterrupt p.wait() 

    File "/usr/lib/python2.7/subprocess.py", line 1389, in wait 
    pid, sts = _eintr_retry_call(os.waitpid, self.pid, 0) 
    File "/usr/lib/python2.7/subprocess.py", line 476, in _eintr_retry_call 
    return func(*args) 
KeyboardInterrupt 

:親からの1、子から1をサブプロセスの実行中にkill -SIGINT 123と入力すると、シグナルは無視されます。

上記を参照してください。

Ctrl-Cではなく、kill -SIGINTは同等であると思われますか?

Ctrl-Cは、Ctrl-Cを発行するttyに関連付けられたフォアグラウンドプロセスグループにSIGINTを送信します。

kill 123と入力すると、サブプロセスが影響を受けないことが保証されますか?

それ自身でkill 123は、pid 123というプロセスにのみ信号を送信します。子供は影響を受けません。

関連する問題