首页 > 解决方案 > 如何在检测按键的节点程序中支持默认 ^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 正常工作的方式?

标签: node.jscommand-line-interface

解决方案


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);

推荐阅读