gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:26:16 24 4
gpt4 key购买 nike

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

到目前为止,我想出了一些 hack 来解决这个问题,但没有什么干净的:

  1. 使用比process.exit更强的东西,也许是process.abort
  2. 生成一个子进程 (childProcess.fork) 以读取,我可以从父进程终止它。但这将创建一个新的 nodejs 实例,内存使用量约为 10mb。
  3. 用我可以更好地控制正在发生的事情(使用线程等)的语言 (C++) 编写一个程序,并从 javascript 调用它。虽然我更愿意留在 js-land。
  4. 或者也许有人知道可以帮助我以不同方式实现目标的工具? (参见下面的背景信息)。也许我不必使用 /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 脚本的树莓派的小项目。我希望程序通过 USB 鼠标的滚轮以及 GPIO 连接的按钮响应用户输入。因此,我使用 onoff GPIO 的库。 onoff 文档建议安装自定义 SIGINT 处理程序以在程序退出之前释放资源,因此这就是这种愿望的来源。为了在没有窗口系统甚至没有终端的情况下处理滚轮数据,我最终想得到 this library工作,但现在我遇到了上述问题。

最佳答案

可能有点粗糙,但是以下内容呢:

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

关于linux - fs.read 阻止自定义信号处理程序中的 process.exit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34549492/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com