2012-06-01 12 views
11

¿Cómo puedo enviar EOF a una transmisión sin cerrar la transmisión?NodeJS: Enviar EOF a la corriente stdin sin secuencia de cierre

Tengo un script que espera la entrada en stdin, luego cuando presiono ctrl-d, escupe salida a stdout, luego espera de nuevo stdin hasta que presione ctrl-d.

En mi secuencia de comandos nodejs, quiero engendrar esa secuencia de comandos, escribir en la secuencia stdin y, a continuación, señalar de alguna manera EOF sin cerrar la secuencia. Esto no funciona:

var http = require('http'), 
    spawn = require('child_process').spawn; 

var child = spawn('my_child_process'); 
child.stdout.on('data', function(data) { 
    console.log(data.toString()); 
}); 

child.stdout.on('close', function() { 
    console.log('closed'); 
}) 

http.createServer(function (req, res) { 
    child.stdin.write('hello child\n'); 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end('Hello World\n'); 
}).listen(1337, '127.0.0.1'); 

Pero si cambio child.stdin.write (...) a child.stdin.end (...), funciona, pero sólo una vez; la corriente se cierra después de eso. He leído en alguna parte que EOF no es en realidad un personaje, es sólo algo que no es un personaje, por lo general -1, por lo que he intentado esto, pero esto tampoco funcionó:

var EOF = new Buffer(1); EOF[0] = -1; 
child.stdin.write("hello child\n"); 
child.stdin.write(EOF); 
+0

Estoy bastante seguro de que esto no es posible. Consulte http://stackoverflow.com/questions/9633577/send-a-eof-in-a-pipe-without-closing-it –

+0

¿Por qué no puede cerrar la secuencia de entrada? Estoy bastante confundido aquí. – jcolebrand

+0

Porque quiero volver a escribir en stdin. El proceso espera EOF, luego corta la entrada y luego vuelve a abrir/dev/stdin para esperar más. –

Respuesta

3

¿Ha intentado child.stdin.write("\x04");? Este es el código ascii para Ctrl + D.

+0

¿Es esto multiplataforma? ¿Eso funcionaría en Windows también? –

+0

No estoy seguro. La pregunta y la respuesta son anteriores al soporte de node.js en Windows; Nunca he ejecutado node.js en un entorno de Windows. ¿Es 'Ctrl + D' una señal en Windows? – cjohn

+0

No lo creo ... –

-1
var os = require("os");  
child.stdin.write("hello child\n"); 
child.stdin.write(os.EOL); 

yo uso esto en mi proyecto y funciona

+1

EOF! = EOL. EOL probablemente sea \ r \ n en Windows y \ n en Linux. –

+0

@ joonas.fi yupp –

2

Usted lo hizo con res sólo dos líneas de abajo ...

  • stream.write(data) se utiliza cuando, desea seguir escribiendo
  • stream.end([data]) se utiliza cuando no necesita enviar más datos (se cerrará la secuencia)
var http = require('http'), 
    spawn = require('child_process').spawn; 

var child = spawn('my_child_process'); 
child.stdout.on('data', function(data) { 
    console.log(data.toString()); 
}); 

child.stdout.on('close', function() { 
    console.log('closed'); 
}) 

http.createServer(function (req, res) { 
    child.stdin.end('hello child\n'); 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end('Hello World\n'); 
}).listen(1337, '127.0.0.1'); 
Cuestiones relacionadas