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/

相关文章:

node.js - csrf token 使用

javascript - 为什么 Node Circle to Polygon 模块返回卵形/椭圆形而不是圆形之类的形状?

node.js - 咕噜声 : Watch file changes and compile parent directory

windows - 如何正确定位 DBGrid 中的图标?

Python:使用 mpi4py 通过 spawn 将数组广播到其他脚本

javascript - bookshelf.js 未加载关系

c++ - 需要一个 undefs 所有在 windows.h 中定义的头文件

java - 如何将 Microsoft Locale ID (LCID) 转换为 Java 中的语言代码或 Locale 对象

python - 通过spawn将JSON从python返回到 Node

java - 如何获取生成的 Java 进程的 PID