Я пытаюсь запустить скрипт на node.js, который последовательно отправляет числа в исполняемый файл a.out
, который квадратизирует его и записывает результат на его stdout. Когда это произойдет, будет отправлен следующий номер. Вот код:Как вручную очистить канал до дочернего процесса в node.js?
var spawn = require('child_process').spawn;
var p = spawn("./a.out",[],{"stdio":"pipe"});
p.stdout.setEncoding("utf8");
p.stdout.on("data",function(data){
var x = parseInt(data.trim()), y = Math.sqrt(x);
console.log("received",x);
if(++y===10) p.kill();
else {
console.log("sending",y);
p.stdin.write(y+"\n");
}
});
var start = 2;
console.log("sending",start);
p.stdin.write(start+"\n");
setTimeout(function(){ p.stdin.end(); },1000);
где a.out
скомпилированная версия для следующей программы C:
#include<stdio.h>
int main(){
int x;
while(scanf("%d",&x)!=EOF)
printf("%d\n",x*x);
return 0;
}
Однако я получаю следующий результат:
sending 2
received 4
sending 3
events.js:72
throw er; // Unhandled 'error' event
^
Error: write after end
Изменение значения миллисекунды в setTimeout
только задерживает ошибку. По-видимому, данные, которые я пытаюсь отправить в a.out
, буферизуются и отправляются только, когда я завершаю трубку. Как очистить его вручную?
Не могли бы вы рассказать о том, как мы это делаем? –
Типичный метод заключается в том, чтобы позволить NUL-байту быть сигналом для сброса. Поэтому всякий раз, когда ваша программа на C читает \ 0, вызовите fflush. – unhammer