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

时间:2014-09-26 07:01:37

标签: python windows node.js sigint

我在Windows 8.1 x64上使用Node.js v0.10.31。我注意到,对于处理SIGINT处理程序的进程(node.js或python脚本),当process.kill(PID, "SIGINT")从另一个node.js进程发送信号时,不会调用处理程序,因此导致它终止。但是我确实验证了如果通过在控制台中按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')

为什么不调用处理程序?

1 个答案:

答案 0 :(得分:1)

似乎不是Node.js发送SIGINT的问题,而是Windows平台问题。那是因为当我从python程序发送SIGINT时,它也无条件地终止处理SIGINT事件的进程:

os.kill(pid, signal.SIGINT)

幸运的是,Python更好地记录了这一点:

  

os.kill(pid,sig)

     

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

     

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