3

node.js 環境でオンライン C++ コンパイラを作成するコードを書いています。spawn 関数を使用して、コードをコンパイルして実行し、出力をユーザーに送り返す子プロセスを作成しました。しかし、実行中の C++ プログラムに入力を送信する必要があります。child.stdin.write('data'); データを子に送信するために使用しcinましたが、プログラムで入力を受信して​​いないと思います。
実行中の C++ コードに入力を送信するのを手伝ってください。
ありがとう。

4

2 に答える 2

3

1.入力データを含むファイルを作成します。
2.ReadStreamオープニング入力ファイルを作成します。
3. でパイプReadStreamchildprocess.stdinます。

file=fs.createReadStream('input.txt',{encoding:'utf8'});
file.pipe(childprocess.stdin);

これは私にとってはうまくいきました。

于 2014-11-21T00:18:35.373 に答える
2

メッセージを渡したい場合は、おそらくクラスターまたはフォークのいずれかを使用する必要があります...これを行うと、ノードはprocess.send経由で通信できるようにIPCをセットアップします


または、通信チャネルに pub/sub システムを使用することもできます (これには Redis が適しています)。これは、サーバー間の通信が必要な場合にも最適です。


以下は、古い作業スクリプトの例です...

var env = process.env.NODE_ENV || 'dev';
var cluster = require("cluster");

//TODO: need to adjust to use domains for this work
process.on('uncaughtException', function (err) {
  console.error('GENERAL EXCEPTION IN %s: %s', process.env.WORKER_TYPE || 'MASTER',err);
  if (err.stack) console.error(err.stack);
  if (cluster.isWorker) {
    //process.send notifies the parent process of the error
    process.send({
      err: {
        "str": err && err.toString() || "unknown error"
        ,"message": err && err.message || null
        ,"stack": err && err.stack || null
      }
    });
  }
  process.nextTick(function(){
    process.exit(666);
  });
});


if (cluster.isMaster) startMaster();
if (cluster.isWorker) startWorker();

function startMaster() {
  createWorker("foo");
  createWorker("bar");
}

function createWorker(workerType) {
  var worker = cluster.fork({"WORKER_TYPE":workerType}); //passes environment variables to child
  worker.on('online',onOnline.bind(null, worker));
  worker.on('message',onMessage.bind(null, worker)); 
  worker.on('exit',onExit.bind(null, worker));
  worker.workerType = workerType;
  return worker; 
  // you can use worker.send() to send a message that 
  // will raise a message event in the child
}

function startWorker() {
  console.log("Running Worker: %s %s", cluster.worker.id, process.env.WORKER_TYPE);
  setTimeout(process.exit.bind(process,0), 5000); //close in 5 seconds
  //you may want to load a specific module based on WORKER_TYPE
}

function onOnline(worker) {
  console.log("Worker Online: %s %s", worker.id, worker.workerType);
  //console.log(arguments);
}

function onMessage(worker, msg) {
  if (msg.err) {
    console.warn("Error From", worker.id, worker.workerType, msg.err);
  } else {
    console.log("Message From", worker.id, worker.workerType);
  }
  //console.log(arguments);
}

function onExit(worker, code, signal) {
  console.log("Worker Exited: %s %s %s %s", worker.id, worker.workerType, code, signal);

    if (env == 'dev') {
        //for now just exit the whole thing (dev mode)
        process.nextTick(function(){
            process.exit(1);
        });
    } else {
        //workers should simply keep working...
        //fire off a new worker
        createWorker(worker.workerType);
    }

}
于 2014-11-20T23:52:15.023 に答える