2013-09-09 6 views
7

Я искал через документации Python для сигнала и в примере кода:Python: параметр кадра обработчика сигнала

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

Параметр «кадр» не используется в реальной функции. Я заметил это в большом количестве кода в stackoverflow/online относительно обработчиков сигналов. Что такое параметр «frame»? Почему он хранится в заголовке функции?

Спасибо

ответ

2

Это ток stack frame.

Например, может быть полезно распечатать текущую информацию о стеке, прежде чем прерывать некоторые сигналы.

2

Параметр кадра - Python stack frame. Извлеченный из руководства:

Обработчик вызывается с двумя аргументами: номером сигнала и текущего кадра стека (None или объект кадра, для описания объектов кадра, см описание в иерархии типов или увидеть описания атрибутов в модуле проверки).

Он часто игнорируется в примерах, которые вы видите, потому что он не особенно полезен вне отладчика Python. Сигналы являются асинхронными и вовлекают процесс волей-неволей. Если я отправлю SIGTERM в ваш процесс и вы настроили его, где ваш код был, когда он получил сигнал, обычно не имеет значения.

7

Аргумент 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) 
Смежные вопросы