首页 > [Node.js]有没有办法使得process捕获到SIGINT信号程序直接退出?

[Node.js]有没有办法使得process捕获到SIGINT信号程序直接退出?

代码:

#!/usr/bin/env node
// npm install sync-prompt
var prompt = require('sync-prompt').prompt;

var name = prompt('what is your name? ');
console.log('Hello ' + name);
var fruit = prompt('what is your favorite fruit? ');
console.log('me too');
process.on('SIGINT', function(){
    process.exit(0);
});
console.log('this would be print after you type CTRL+C');
process.exit(0);

输出结果:

[honwhy@localhost nodejs]$ ./example.js 
what is your name? honey
Hello honey
what is your favorite fruit? ^Cme too
this would be print after you type CTRL+C

由于process.on是异步执行的,所以在程序退出前还会输出me toothis would be...等语句。
有没有办法在程序(process)捕获到SIGINT后同步方式执行,直接退出程序呢?

UPDATE
对原作者的模块源码做了一点修改了,提交了pull request,不过貌似提交失败了,等待结果中。issue地址:https://github.com/shovon/sync-prompt/pull/9
(2014年7月7日 18:39:17)


process.on() 确实无法实现。

我觉得这个是 sync-prompt 自己的问题,这里面有两个问题:

  1. 它没有在 std::getline() 之后检查 cin.eof(),如果检查了就有机会用某种方式通知到调用者这个情况,让调用者有机会处理一下。其实不光 Ctrl + C,如果按 Ctrl + D 直接关闭 stdin 也会有同样的问题,而且 Ctrl + D 根本就不可能通过信号来捕获。
  2. sync-prompt 它根本就不应该直接使用 cin,这本身就错误了。你可以试一下,如果先写了 process.stdin.on("end", function() {}) 再执行 prompt(),就会发现 prompt() 会立即返回,此时如果在它的源码里面输出 cin.eof() 状态可以看到这个返回了 true。这是因为这个 on() 调用启用了 stream 模式,关闭了原先的 stdin fd,使得 getline(cin, retval) 这句话彻底不工作了。

如果还想继续用它,那么就把上面的第一条说的回调机制实现了吧,要不然就完全无解了。


Update:刚刚看了下 sync-prompt 仓库,发现作者在几天前加上一个 prompt.isEOF() 的函数,这样终于可以判断一下是不是因为 EOF 退出的了。不过最新的代码貌似还没发布到 npm registry,要想用就需要手动下载代码编译了。


setTimeout(function(){
    console.log('Hello ' + name);
    var fruit = prompt('what is your favorite fruit? ');
    console.log('me too');
    console.log('this would be print after you type CTRL+C');
    process.exit(0);
},10);
【热门文章】
【热门文章】