如何将 "CTRL+C" 发送到 Node.js 中的子进程?

How to send "CTRL+C" to child process in Node.js?

我尝试生成子进程 - vvp (https://linux.die.net/man/1/vvp)。在某个时间,我需要发送 CTRL+C 到那个进程。 我期待模拟会被中断,我会得到交互式提示。之后我可以通过向子进程发送命令来继续模拟。 所以,我尝试了这样的事情:

var child = require('child_process');
var fs = require('fs');
var vcdGen = child.spawn('vvp', ['qqq'], {});

vcdGen.stdout.on('data', function(data) {
  console.log(data.toString())
});

setTimeout(function() {
  vcdGen.kill('SIGINT');
}, 400);

在那种情况下,一个子进程被停止了。 我也试过 vcdGen.stdin.write('\x03') 而不是 vcdGen.kill('SIGINT'); 但它不起作用。

也许是因为Windows? 有什么方法可以实现与我在 cmd 中得到的相同的行为吗?

kill 仅真正支持 Windows 上的粗鲁进程终止 - Windows 和 *nix 中的应用程序信号模型不兼容。你不能通过标准输入传递 Ctrl+C,因为它永远不会通过标准输入——它是控制台子系统的一个功能(因此你只能在进程有一个附加的控制台时使用它)。它在子进程中创建一个新线程来完成它的工作。

没有受支持的方式以编程方式执行此操作。它是面向用户的功能,而不是应用程序。做到这一点的唯一方法是做控制台子系统做的同样的事情——在目标应用程序中创建一个新线程并让它做信号。但最好的方法是简单地使用合作信号 - 尽管这当然需要您更改目标应用程序以理解信号。

如果您想走完全不受支持的路线,请查看 。

如果您想找到中间立场,当然可以向您自己发送信号。这也意味着如果您的控制台已连接,您可以将 Ctrl+C 发送到进程。不用说,这非常棘手 - 您可能想要创建一个本机主机进程,它除了创建一个控制台和 运行 您想要 运行 的实际程序外什么都不做。然后您的主机进程将侦听一个事件,并在发出事件信号时调用 GenerateConsoleCtrlEvent.