在Node.js中检测CTRL + C
我从一个不同的SO问题得到这个代码,但节点抱怨使用process.stdin.setRawMode而不是tty,所以我改变了它。
之前:
var tty = require("tty"); process.openStdin().on("keypress", function(chunk, key) { if(key && key.name === "c" && key.ctrl) { console.log("bye bye"); process.exit(); } }); tty.setRawMode(true);
后:
process.stdin.setRawMode(true); process.stdin.on("keypress", function(chunk, key) { if(key && key.name === "c" && key.ctrl) { console.log("bye bye"); process.exit(); } });
在任何情况下,只是创build一个完全没有响应的节点进程,什么也不做,第一个抱怨tty
,然后抛出一个错误,第二个什么也不做,禁用Node的本地CTRL + C处理程序,所以它甚至不退出当我按下它的节点。 如何在Windows中成功处理Ctrl + C ?
如果您要捕获中断信号SIGINT
,则不需要从键盘读取数据。 nodejs
的process
对象公开了一个中断事件:
process.on('SIGINT', function() { console.log("Caught interrupt signal"); if (i_should_exit) process.exit(); });
编辑 :不适用于没有解决方法的Windows。 看这里
对于那些需要function的人来说,我发现了死亡(npm结节,呵呵!) 。
作者还声称它在Windows上工作:
它只在POSIX兼容系统上testing过。 这里是关于Windows信号的一个很好的讨论,显然,这已经被修复/映射。
我可以确认CTRL + C在win32上工作(是的,我很惊讶)。
由于setRawMode()
调用,该过程似乎没有响应。
这个调用基本上意味着你需要处理所有的按键,包括默认的按键(这就是为什么Ctrl + C不能工作了),“原始”input直接传递到你的程序中。
试试这个代码(不在Windows上testing):
process.stdin.setRawMode(true); process.stdin.on('data', function(b) { if (b[0] === 3) { process.stdin.setRawMode(false) process.exit() } })