I tried to spawn child process - vvp (https://linux.die.net/man/1/vvp https://linux.die.net/man/1/vvp). At the certain time, I need to send CTRL+C to that process.
I am expecting that simulation will be interrupted and I get the interactive prompt. And after that I can continue the simulation by send command to the child process.
So, I tried something like this:
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 https://stackoverflow.com/a/1179124/3032289.
如果你想找到中间立场,有一种方法可以向yourself, 当然。这也意味着如果您的控制台已连接,您可以将 Ctrl+C 发送到进程。不用说,这非常棘手 - 您可能想要创建一个本机主机进程,它除了创建控制台并运行您想要运行的实际程序外什么也不做。然后,您的主机进程将侦听事件,当事件发出信号时,调用生成控制台Ctrl事件 https://msdn.microsoft.com/en-us/library/ms683155%28v=vs.85%29.aspx.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)