亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

[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 關注
  • 701 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號