Node.js:从process.kill()发送的SIGINT无法处理

我在Windows 8.1 x64上使用Node.js v0.10.31。 我注意到,对于处理SIGINT处理程序的进程(node.jspython脚本),当信号从另一个node.js进程(由process.kill(PID, "SIGINT")处理)发送时,不会调用该处理程序process.kill(PID, "SIGINT")从而导致它终止。 但是,我确实证实,如果通过在控制台中按CTRL-C发送SIGINT,则会调用处理程序。

这里是处理SIGINT (CoffeeScript)的Node.js脚本:

 process.on 'SIGINT', -> console.log "SIGINT handled" process.stdin.pipe(process.stdout) console.log "PID: #{process.pid}" 

控制台输出:

 PID: 6916 SIGINT handled (this happens when pressing ctrl-c in console) SIGINT handled (this happens when pressing ctrl-c in console) # process terminates when another process calls process.kill(6916, 'SIGINT') 

这里是一个处理SIGINT的python脚本,它也被node.js process.kill(PID, 'SIGINT')无条件地杀死:

 from signal import signal, SIGINT import os import time def handler(signum, frame): print "signal handled:", signum, raise KeyboardInterrupt signal(SIGINT, handler) print "PID: ", os.getpid() while True: try: time.sleep(1e6) except KeyboardInterrupt: print " KeyboardInterrupt handled" 

控制台输出:

 PID: 6440 signal handled:2 KeyboardInterrupt handled (this happens when pressing ctrl-c in console) signal handled:2 KeyboardInterrupt handled (this happens when pressing ctrl-c in console) # process terminated by another node.js script's process.kill(6440, 'SIGINT') 

为什么不叫处理程序?

Solutions Collecting From Web of "Node.js:从process.kill()发送的SIGINT无法处理"

看起来不是发送SIGINT的Node.js的问题,而是一个Windows平台的问题。 这是因为当我从一个python程序发送SIGINT的时候,它也会无条件地终止处理SIGINT事件的进程:

 os.kill(pid, signal.SIGINT) 

幸运的是,Python文档更好:

os.kill(pid,sig)

发送信号sig到进程pid。 主机平台上可用的特定信号的常数在信号模块中定义。

Windows:信号.CTRL_C_EVENT和signal.CTRL_BREAK_EVENT信号是特殊的信号,只能发送到共享控制台窗口的控制台进程,例如某些子进程。 sig的任何其他值都将导致进程被TerminateProcess API无条件地终止,退出代码将被设置为sig。 kill()的Windows版本还会使进程句柄被终止。