如何在Node.js中向子进程发送“CTRL + C”?

时间:2017-02-01 09:53:56

标签: node.js windows spawn sigint

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

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中相同的行为?

1 个答案:

答案 0 :(得分:2)

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

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

如果您想要完全不受支持的路线,请查看https://stackoverflow.com/a/1179124/3032289

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