我试图产生subprocess-vvp( https://linux.die.net/man/1/vvp )。 在某个时候,我需要发送CTRL + C到那个进程。 我期待模拟将被中断,我得到交互提示。 之后,我可以通过发送命令继续进行模拟subprocess。 所以,我尝试了这样的事情:
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);
在这种情况下,一个subprocess被停止了。 我也尝试了vcdGen.stdin.write('\x03')
而不是vcdGen.kill('SIGINT');
但这不行。
也许是因为Windows? 有没有什么办法可以达到和我在cmd中一样的行为?
kill
只能真的支持Windows上粗鲁的进程kill – Windows和* nix中的应用程序信号模型是不兼容的。 你不能通过标准输入来传递Ctrl+C
,因为它从来没有通过标准输入 – 它是控制台子系统的一个功能(因此,如果进程有一个连接的控制台,你只能使用它)。 它在子进程中创建一个新线程来完成它的工作。
没有支持的方式来以编程方式执行此操作。 这是用户的功能,而不是应用程序。 要做到这一点的唯一方法是做同样的事情控制台子系统 – 在目标应用程序中创建一个新的线程,并让它做信号。 但最好的方法是简单地使用合作信号代替 – 尽管这当然要求你改变目标应用程序来理解信号。
如果您想要完全不支持的路线,请参阅https://stackoverflow.com/a/1179124/3032289 。
如果你想找到一个中间立场,当然,有一种方法可以发送信号给自己 。 这也意味着,如果您的控制台已连接,则可以将Ctrl + C发送到进程。 不用说,这是非常棘手的 – 你可能会想创建一个本地主机进程,除了创建一个控制台并运行你想运行的实际程序。 您的主机进程将监听一个事件,并在事件发出信号时调用GenerateConsoleCtrlEvent 。