如何在翻译的RPython程序中捕获信号(特别是/ SIGINT
)?
我已经通过PyPy源代码树,我发现了CPython signal
模块,并且在翻译的程序中尝试使用它会在翻译过程中出现预期的错误:
[translation:ERROR] Exception: unexpected prebuilt constant: <built-in function signal>
还有pypy.module.signal
但我不知道这是我应该使用的,或者如何使用它。该模块确实提供了signal
函数,但它需要额外的space
参数;这些space
参数通过源代码树出现在一些地方,我无法弄清楚他们所指的是什么,或者我应该通过那里传递什么。
后台:我希望计算运行一段任意时间,但是捕获^C
以便我可以在程序退出之前打印出结果。 (主循环周围明显的try: ... except KeyboardInterrupt: ...
也不起作用。)
答案 0 :(得分: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()