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

标签 node.js windows spawn sigint

我尝试生成子进程 - 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,因为它永远不会通过标准输入 - 它是控制台子系统的一个功能(因此你只能在进程有附加控制台的情况下使用它) .它在子进程中创建一个新线程来完成它的工作。

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

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

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

关于node.js - 如何将 "CTRL+C"发送到 Node.js 中的子进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41976651/

相关文章:

javascript - NodeJS - 如何强制函数仅在集群中的特定工作 ID 上运行?

node.js - CircleCI 忘记机器执行器上的 Node 版本

c++ - 最大化 CPU 使用率

python - 在 PyInstaller 应用程序中启用 Windows 长文件路径支持

c++ - 编写跨平台程序

node.js - 子标准输出设置为 "inherit"和 "onData"监听器

node.js - 如何在 curl 请求中传递 cookie

node.js - AngularJS 和 ExpressJS session 管理?

javascript - 返回顺序运行的子进程的 promise

node.js - 如何使用 Nodejs 和 spawn 在 Windows 10 上以管理员身份运行一些 CMD 命令?