fs.read阻止自定义信号处理程序中的process.exit

时间:2015-12-31 17:12:18

标签: linux node.js

我无法从信号处理程序中使用process.exit()让我的nodejs应用程序退出。这是因为我在Linux输入事件节点(/dev/input/mouse1)上有一个挂起的读操作。我花了几个小时研究,但我能找到的只有this SO question。我尝试使用fs.ReadStream,就像在那里使用它并调用它的destroy方法,但它也没有用。即使通过阅读nodejs源代码,我也无法想出一个想法。然后有这个issue on github,它在某种程度上是相关的。

到目前为止,我想出了一些解决这个问题的方法,但没有任何干净:

  1. 使用强于process.exit的内容,可能process.abort
  2. 将子进程(childProcess.fork)生成到read,我可以从父进程终止它。但这将创建一个新的nodejs实例,内存使用量约为10mb。
  3. 用一种语言(C ++)编写程序,我可以更好地控制正在进行的操作(使用线程等)并从javascript中调用它。虽然我宁愿留在js-land。
  4. 或许有人知道一种可以帮助我以不同方式实现目标的工具? (见下面的背景信息)。也许我不必使用/dev/input/
  5. 基本上,我需要一种方法来直接或间接取消待处理的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能够正常工作,但现在我遇到了上述问题。

1 个答案:

答案 0 :(得分:0)

可能有点粗糙,但以下内容如何:

process.on('SIGINT', () => {
    fs.closeSync(mouse);
    setTimeout(process.exit, 1000);
});