在RPython中捕获信号

时间:2012-04-24 10:14:41

标签: signals pypy rpython

如何在翻译的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: ...也不起作用。)

1 个答案:

答案 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()