Python和C都允许用户安装信号处理程序。但是,如果Python程序调用C代码,并且该C代码安装了C信号处理程序,那么Python程序还会为相同的信号安装Python信号处理程序,此后该信号将如何处理?
更具体地说,当用户在Python中调用signal.signal
时会发生什么?除了Python信号处理程序外,Python是否还安装了C信号处理程序来代替旧的C信号处理程序?如果是这样,Python环境中返回的旧C信号处理程序在哪里?
man sigaction
说:
如果
oldact
为非NULL,则先前的操作将保存在oldact
中。
但是Python signal.signal
返回的是旧的Python信号处理程序,而不是旧的C信号处理程序。
答案 0 :(得分:1)
看起来Python放弃了旧的信号处理程序。 Python确实安装了自己的C处理程序here (Python source code)。该处理程序管理Python信号。
PyOS_setsig
确实返回了旧的C处理程序,但链接的行将其丢弃。 signal.signal
的Python实现也返回一个“上一个”处理程序,但它仅跟踪内部列表(请参见变量Handlers
)。它不知道任何C处理程序。