我无法从信号处理程序中使用process.exit()
让我的nodejs应用程序退出。这是因为我在Linux输入事件节点(/dev/input/mouse1
)上有一个挂起的读操作。我花了几个小时研究,但我能找到的只有this SO question。我尝试使用fs.ReadStream,就像在那里使用它并调用它的destroy
方法,但它也没有用。即使通过阅读nodejs源代码,我也无法想出一个想法。然后有这个issue on github,它在某种程度上是相关的。
到目前为止,我想出了一些解决这个问题的方法,但没有任何干净:
process.exit
的内容,可能process.abort
childProcess.fork
)生成到read
,我可以从父进程终止它。但这将创建一个新的nodejs实例,内存使用量约为10mb。/dev/input/
基本上,我需要一种方法来直接或间接取消待处理的read
操作(例如,通过从active_handles
列表中清除它们)。
提前感谢您的回答!
在下面的代码示例中,我可以按ctrl + c,但nodejs只会在我移动鼠标后退出:
'use strict'
const fs = require('fs');
const buf = new Buffer(24);
const mouse = fs.openSync('/dev/input/mouse1', 'r');
const onRead = (err, bytesRead, buffer) => {
console.log('read');
if (!err) {
process.nextTick(fs.read, mouse, buf, 0, buf.length, null, onRead);
}
};
fs.read(mouse, buf, 0, buf.length, null, onRead);
process.on('SIGINT', () => {
fs.closeSync(mouse);
process.exit();
});
我正在开发一个基于运行nodejs脚本的raspberry pi的小项目。我希望程序通过USB鼠标的滚轮以及附带GPIO的按钮响应用户输入。因此,我将onoff库用于GPIO的内容。 onoff
文档建议在程序退出之前安装自定义SIGINT处理程序以释放资源,这样就可以满足这种需求。为了在没有窗口系统甚至终端的情况下处理滚轮数据,我最终希望this library能够正常工作,但现在我遇到了上述问题。
答案 0 :(得分:0)
可能有点粗糙,但以下内容如何:
process.on('SIGINT', () => {
fs.closeSync(mouse);
setTimeout(process.exit, 1000);
});