2017-02-01 7 views
1

子プロセスを作成しようとしました - vvp(https://linux.die.net/man/1/vvp)。ある時点で、私はCTRL + Cをそのプロセスに送る必要があります。 シミュレーションが中断され、対話型プロンプトが表示されることを期待しています。その後、私は子プロセスにコマンドを送ることでシミュレーションを続けることができます。 だから、私はこのような何か試してみました:Node.jsの子プロセスに "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.kill('SIGINT');の代わりにvcdGen.stdin.write('\x03')を試しましたが、動作しません。

多分Windowsのためですか? cmdと同じ動作を実現する方法はありますか?

+0

Windowsタグが追加されているため、cmdが不要(子プロセスよりも具体的です) – Richard

+0

@Richard cmdはまったく関与していません。コンソールサブシステムとは何の関係もありません(もちろん、他のコンソールアプリケーションとは異なります)。 – Luaan

答えて

2

killは、実際にはWindowsでのプロセスの強制終了をサポートしています.Windowsと* nixのアプリケーション信号モデルは互換性がありません。 Ctrl+Cを標準入力で渡すことはできません。これは、標準入力からは決して来ないので、コンソールサブシステムの機能です(したがって、プロセスにコンソールが接続されている場合にのみ使用できます)。子プロセスに新しいスレッドを作成してその作業を行います。

プログラムでこれを行う方法はありません。これはユーザーにとっての機能であり、アプリケーションではありません。これを行う唯一の方法は、コンソールサブシステムと同じことを行うことです。ターゲットアプリケーションに新しいスレッドを作成し、シグナリングを実行させます。しかし、最善の方法は、単純に協調型シグナリングを使用することです。もちろん、信号を理解するためにターゲットアプリケーションを変更する必要があります。

完全にサポートされていないルートに移動する場合は、https://stackoverflow.com/a/1179124/3032289をご覧ください。

中間地点を探したい場合は、もちろんに信号を送信する方法があります。、もちろんです。これは、コンソールが接続されている場合にCtrl + Cをプロセスに送ることもできるということも意味します。言うまでもなく、これは非常に難しいことです。コンソールを作成し、実行したい実際のプログラムを実行するだけの何もしないネイティブのホストプロセスを作成したいと思うかもしれません。あなたのホストプロセスはイベントを待ち受け、イベントが通知されたらGenerateConsoleCtrlEventに電話をかけます。

関連する問題