18

シグナルのPythonドキュメントとサンプルコードを調べていました:

def handler(signum, frame):
    print 'Signal handler called with signal', signum
    raise IOError("Couldn't open device!")

'frame' パラメータは実際の関数では使用されません。シグナルハンドラーに関するstackoverflow/onlineの多くのコードでこれに気付きました。「フレーム」パラメータとは何ですか? 関数ヘッダーに保持されるのはなぜですか?

ありがとうございました

4

3 に答える 3

20

frame 引数は、実行フレームとも呼ばれるスタック フレームです。信号によって中断されたフレームを指します。どのスレッドもシグナルによって中断される可能性がありますが、シグナルはメインスレッドでのみ受信されるため、このパラメーターは必須です。

例:

import signal
import os
import traceback

def handler(signum, frame):
    print signum, frame
    print "print stack frames:"
    traceback.print_stack(frame)

def demo(n):
    if n == 3:
        os.kill(os.getpid(), signal.SIGUSR1)
        return
    demo(n+1)

signal.signal(signal.SIGUSR1, handler)
demo(1)

出力:

$ python t.py
10 <frame object at 0x1e00520>
print stack frames:
  File "t.py", line 17, in <module>
    demo(1)
  File "t.py", line 14, in demo
    demo(n+1)
  File "t.py", line 14, in demo
    demo(n+1)
  File "t.py", line 12, in demo
    os.kill(os.getpid(), signal.SIGUSR1)
于 2013-09-09T19:14:10.527 に答える
5

フレーム パラメータはPython スタック フレームです。マニュアルからの抜粋:

ハンドラーは 2 つの引数で呼び出されます: シグナル番号と現在のスタック フレーム (None またはフレーム オブジェクト。フレーム オブジェクトの説明については、型階層の説明を参照するか、inspect モジュールの属性の説明を参照してください)。

これは、Python デバッガーの外では特に有用ではないため、ご覧の例では無視されることがよくあります。シグナルは非同期であり、プロセスに無条件にヒットします。あなたのプロセスに SIGTERM を送信し、それを処理するように設定した場合、シグナルを受信したときにコードがどこにあったかは通常関係ありません。

于 2013-09-09T19:10:35.717 に答える