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

You should probably use either cluster, or fork if you want to pass messages... if you do this, node will setup IPC for you to be able to communicate via process.send


Alternatively, you could use a pub/sub system for communication channels (Redis works well for this), this is also your best bet if you need communications across servers.


Below is an example of an older work script...

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 回答