2012-04-24 5 views
2

Как поймать сигналы (особенно/особенно SIGINT) в переведенной программе RPython?Улавливающие сигналы в RPython

Я grepped через источник дерева PyPy, я нашел модуль CPython signal, и пытается использовать это в переводе программы дает ожидаемую ошибку при переводе:

[translation:ERROR] Exception: unexpected prebuilt constant: <built-in function signal> 

Там есть также pypy.module.signal, но я не знаю, что я должен использовать или как его использовать. Этот модуль предоставляет функцию signal, но для этого требуется дополнительный параметр space; эти параметры space появляются в нескольких местах через исходное дерево, и я не могу понять, на что они ссылаются, или что я должен пройти там.

фон: Я ищу иметь вычисление, которое работает для произвольного отрезка времени, но захватить ^C так, что я могу распечатать результаты до сих пор до выхода из программы. (Очевидный try: ... except KeyboardInterrupt: ... вокруг основного контура также не работает.)

ответ

3

Вам нужно будет использовать функции обработки сигналов RPython, которые являются небольшими обертками над платформами. Функции, которые вам понадобятся, находятся в pypy.module.signal.interp_signal. Например, pypysig_ignore(signum) эквивалентен signal(signum, SIG_IGN). Вызовите pypysig_poll, чтобы вернуть ожидающий сигнал, если он есть. Вот выдержка, чтобы попросить обработать сигнал и ждать его прибытия.

pypysig_setflag(signum) 
while True: 
    n = pypysig_poll() 
    if n < 0: 
     # No signals pending 
     break 
    if n == signum: 
     handle_signal() 
+0

Спасибо, предположительно, вы запустили это с главной нити? Это очень похоже на оживленное ожидание. Кроме того, [interp_signal.signal] (https://bitbucket.org/pypy/pypy/src/7fc6072593dd/pypy/module/signal/interp_signal.py#cl-249) не является полезным/полезным? Кажется, что все это сделано управляемым образом, но я не могу понять, что такое параметр 'space' (я думаю, это действительно мой реальный вопрос, я понимаю, если вы не знакомы с внутренними элементами RPython и так что не могу ответить на этот вопрос ... и не могу, ха-ха!) – huon

+0

(я добавил немного больше вопросов на вопрос, если это вообще актуально.) – huon

+0

Вы должны иногда запускать цикл, который я дал для проверки для прерываний. –