2017-02-01 2 views
1

Я попытался создать дочерний процесс - vvp (https://linux.die.net/man/1/vvp). В определенный момент мне нужно отправить CTRL + C. Я ожидаю, что симуляция будет прервана, и я получу интерактивную подсказку. И после этого я могу продолжить симуляцию командой send для дочернего процесса. Итак, я пытался что-то вроде этого:Как отправить «CTRL + C» дочернему процессу в Node.js?

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?

+0

Добавлен тег Windows (критический вопрос) и, следовательно, не требуется cmd (и spawn более конкретно, чем дочерний процесс) – Richard

+0

@Richard Не говоря уже о том, что cmd вообще не задействован - это всего лишь командный процессор и не имеет ничего общего с консольной подсистемой (помимо консольного приложения, как и любое другое, конечно). – Luaan

ответ

2

kill только действительно поддерживает грубое уничтожение процесса в Windows - модель сигнала приложения в Windows и * nix несовместима. Вы не можете передать Ctrl+C через стандартный ввод, потому что он никогда не приходит через стандартный вход - это функция консольной подсистемы (и, следовательно, вы можете использовать ее только в том случае, если процесс имеет подключенную консоль). Он создает новый поток в дочернем процессе для выполнения своей работы.

Существует нет поддерживаемого способа сделать это программно. Это функция для пользователя, а не для приложений. Единственный способ сделать это - сделать то же самое, что делает консольная подсистема - создать новый поток в целевом приложении и позволить ему выполнять сигнализацию. Но лучшим способом было бы просто использовать когерентную сигнализацию вместо этого - хотя это, конечно, требует от вас изменить целевое приложение, чтобы понять сигнал.

Если вы хотите пройти совершенно неподдерживаемый маршрут, взгляните на https://stackoverflow.com/a/1179124/3032289.

Если вы хотите найти среднюю площадку, есть способ отправить сигнал самостоятельно, конечно. Это также означает, что вы можете отправить Ctrl + C в процесс, если ваши консоли подключены. Излишне говорить, что это очень сложно - вы, вероятно, захотите создать собственный хост-процесс, который ничего не делает, кроме создания консоли и запуска текущей программы, которую вы хотите запустить. Затем ваш хост-процесс прослушивает событие, а когда событие сигнализируется, вызовите GenerateConsoleCtrlEvent.

Смежные вопросы