2012-06-01 13 views
11

Jak mogę zasygnalizować EOF do strumienia bez zamykania strumienia?NodeJS: Wyślij EOF do strumienia standardowego bez strumienia zamykającego

Mam skrypt, który czeka na wejście na stdin, a następnie po naciśnięciu ctrl-d wypluwa wyjście na standardowe wyjście, po czym czeka ponownie na standardowe wejście, dopóki nie naciśnie ctrl-d.

W moim skrypcie nodejs chcę odrodzić ten skrypt, napisać do strumienia stdin, a następnie jakoś zasygnalizować EOF bez zamykania strumienia. To nie działa:

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'); 

Ale jeśli zmienię child.stdin.write (...) do child.stdin.end (...), to działa, ale tylko raz; po tym strumień jest zamknięty. Czytałem gdzieś, że EOF nie jest w rzeczywistości charakter, to jest po prostu coś, że nie jest to znak, zwykle -1, więc próbowałem tego, ale to nie działa albo:

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

Jestem prawie pewien, że to niemożliwe. Zobacz http://stackoverflow.com/questions/9633577/send-a-eof-in-a-pipe-without-closing-it –

+0

Dlaczego nie możesz po prostu zamknąć strumienia wejściowego? Jestem tu raczej zdezorientowany. – jcolebrand

+0

Ponieważ chcę ponownie napisać do standardowego wejścia. Proces czeka na EOF, a następnie fragmenty na wejściu, a następnie ponownie otwiera/dev/stdin, aby poczekać na więcej. –

Odpowiedz

3

Czy próbowałeś child.stdin.write("\x04");? To jest kod ASCII dla Ctrl + D.

+0

Czy jest to platforma wieloplatformowa? Czy to też działa w systemie Windows? –

+0

Nie jestem pewien. Pytanie i odpowiedź poprzedzają obsługę node.js w systemie Windows; Nigdy nie uruchomiłem node.js w środowisku Windows. Czy 'Ctrl + D' jest sygnałem w systemie Windows? – cjohn

+0

Nie sądzę ... –

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

Używam tego w moim projekcie i działa

+1

EOF! = EOL. EOL prawdopodobnie \ r \ nw systemie Windows i \ n w systemie Linux. –

+0

@ joonas.fi yupp –

2

Zrobiłeś to z res zaledwie dwóch liniach poniżej ...

  • stream.write(data) jest używany, gdy ty chcesz kontynuować pisanie
  • stream.end([data]) jest używany, gdy nie trzeba wysyłać więcej danych (spowoduje to zamknięcie strumienia)
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'); 
Powiązane problemy