node.js - 如何在检测按键的节点程序中支持默认 ^Z 行为?
问题描述
我创建了一个 node.js 程序,该程序stdin
通过使用setRawMode(true)
, per this获取按键输入。我已经做到了,^C
并且^D
(control-C/control-D) 已处理;代码基本上是这样的:
process.stdin.setRawMode(true)
process.stdin.on('data', data => {
if (Buffer.from([0x03]).equals(data) || Buffer.from([0x04]).equals(data)) {
process.exit()
}
})
简单地通过导致程序退出来伪造如何^C
和工作是很容易的。^D
但是我怎样才能^Z
工作呢?显然我不能伪造它,因为它通常是 bash 自己处理的。有没有办法告诉 bash/sh/whatever 把程序放到后台,^Z 正常工作的方式?
解决方案
Unix & Linux StackExchange 上的这个答案很有用。我们需要向我们自己的进程发送一个信号- 特别是SIGTSTP
:
process.kill(process.pid, 'SIGTSTP');
在我的程序上下文中,我还必须在发送之前清理任何终端更改(例如隐藏光标,使用备用屏幕)SIGTSTP
;我必须在收到后重新申请SIGCONT
:
process.on('SIGCONT', () => {
process.stdout.write(...);
});
由于某种原因,我还发现process.stdin.setRawMode
需要刷新SIGCONT
:
process.stdin.setRawMode(false);
process.stdin.setRawMode(true);
推荐阅读
- excel - 重新调整二维数组在循环的第二次迭代中给出错误 nº 9“下标超出范围”: - 无法找出原因
- python - 游戏在 Python Tic-Tac-Toe 游戏中不起作用
- python - SQLAlchemy 和 mysql 在并发请求上抛出错误
- node.js - 级联 onDelete 不适用于 sqlite knex
- javascript - Firebase FCM onMessage 触发但因未定义 showNotification 而失败
- react-native - 反应本机博览会初始化问题
- python - DataFrame行列转换优化
- python - 烧瓶文件线程'ValueError:关闭文件上的I / O操作'
- c# - 如何从 C# 代码将 *& 和 **& 参数传递给 C++ dll
- python - 使用 append() 和 DataFrame.columnName 添加熊猫列值,但数据框中没有更新列值