javascript — отправка входных данных дочернему процессу в node.js

Я пишу код для создания онлайн компилятора c ++ в среде node.js. Использование spawn Функция Я создал дочерний процесс, который скомпилирует код, выполнит его и отправит вывод пользователю.
Но мне нужно отправить входные данные для работающей программы C ++. я использовал child.stdin.write('data');
для отправки данных ребенку, но я думаю, cin в программу не поступает ввод.

Пожалуйста, помогите мне отправить ввод в работающий код C ++.
Благодарю.

2

Решение

Вероятно, вам следует использовать кластер или ветвь, если вы хотите передавать сообщения … если вы сделаете это, узел настроит IPC, чтобы вы могли общаться через process.send


В качестве альтернативы, вы можете использовать паб / подсистему для каналов связи (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);
}

}
2

Другие решения

1. Создайте файл с входными данными.
2. Создать ReadStream Открытие входного файла.
3. Трубопровод ReadStream с childprocess.stdin,

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

Это сработало для меня.

2

По вопросам рекламы [email protected]