【问题标题】:How to send "CTRL+C" to child process in Node.js?如何在 Node.js 中向子进程发送“CTRL+C”?
【发布时间】:2017-06-18 00:22:08
【问题描述】:

我试图生成子进程 - 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 中获得的行为相同的行为吗?

【问题讨论】:

  • 添加了 Windows 标签(对问题至关重要),因此不需要 cmd(并且 spawn 比子进程更具体)
  • @Richard 更不用说 cmd 根本不涉及 - 它只是一个命令处理器,与控制台子系统无关(当然,除了像其他任何控制台应用程序一样)。

标签: node.js windows spawn sigint


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    相关资源
    最近更新 更多