如何在检测按键的节点程序中支持默认的^ Z行为?

时间:2018-05-23 20:35:28

标签: node.js command-line-interface

我创建了一个node.js程序,该程序使用stdinthis获取setRawMode(true)的按键输入。我已经这样做了^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 /将程序放到后台,^ Z通常的工作方式?

1 个答案:

答案 0 :(得分:0)

Unix&Linux StackExchange上的

This answer很有用。我们需要send a signal to our own process-特别是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);