为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁花不似锦 2019-04-13 08:45:14
代码:#!/usr/bin/envnode//npminstallsync-promptvarprompt=require('sync-prompt').prompt;varname=prompt('whatisyourname?');console.log('Hello'+name);varfruit=prompt('whatisyourfavoritefruit?');console.log('metoo');process.on('SIGINT',function(){process.exit(0);});console.log('thiswouldbeprintafteryoutypeCTRL+C');process.exit(0);输出结果:[honwhy@localhostnodejs]$./example.jswhatisyourname?honeyHellohoneywhatisyourfavoritefruit?^CmetoothiswouldbeprintafteryoutypeCTRL+C由于process.on是异步执行的,所以在程序退出前还会输出metoo和thiswouldbe...等语句。有没有办法在程序(process)捕获到SIGINT后同步方式执行,直接退出程序呢?UPDATE对原作者的模块源码做了一点修改了,提交了pullrequest,不过貌似提交失败了,等待结果中。issue地址:https://github.com/shovon/sync-prompt/pull/9(2014年7月7日18:39:17)
查看完整描述

2 回答

?
回首忆惘然

TA贡献1847条经验 获得超11个赞

用process.on()确实无法实现。
我觉得这个是sync-prompt自己的问题,这里面有两个问题:
它没有在std::getline()之后检查cin.eof(),如果检查了就有机会用某种方式通知到调用者这个情况,让调用者有机会处理一下。其实不光Ctrl+C,如果按Ctrl+D直接关闭stdin也会有同样的问题,而且Ctrl+D根本就不可能通过信号来捕获。
sync-prompt它根本就不应该直接使用cin,这本身就错误了。你可以试一下,如果先写了process.stdin.on("end",function(){})再执行prompt(),就会发现prompt()会立即返回,此时如果在它的源码里面输出cin.eof()状态可以看到这个返回了true。这是因为这个on()调用启用了stream模式,关闭了原先的stdinfd,使得getline(cin,retval)这句话彻底不工作了。
如果还想继续用它,那么就把上面的第一条说的回调机制实现了吧,要不然就完全无解了。
Update:刚刚看了下sync-prompt仓库,发现作者在几天前加上一个prompt.isEOF()的函数,这样终于可以判断一下是不是因为EOF退出的了。不过最新的代码貌似还没发布到npmregistry,要想用就需要手动下载代码编译了。
                            
查看完整回答
反对 回复 2019-04-13
?
慕容3067478

TA贡献1773条经验 获得超3个赞

setTimeout(function(){
console.log('Hello'+name);
varfruit=prompt('whatisyourfavoritefruit?');
console.log('metoo');
console.log('thiswouldbeprintafteryoutypeCTRL+C');
process.exit(0);
},10);
                            
查看完整回答
反对 回复 2019-04-13
  • 2 回答
  • 0 关注
  • 669 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信