2012-06-01 209 views
11

如何在不關閉流的情況下向EOF發送EOF信號?NodeJS:將EOF發送到stdin流而不關閉流

我有一個腳本,等待stdin上的輸入,然後當我按ctrl-d,它吐出輸出到標準輸出,然後再次等待stdin,直到我按ctrl-d。

在我的nodejs腳本中,我想生成該腳本,寫入標準輸入流,然後以某種方式發出EOF信號而不關閉流。這不起作用:

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

但是,如果我改變child.stdin.write(...),以child.stdin.end(...),它的工作原理,但只有一次;該流在此之後關閉。我讀的地方,EOF實際上不是一個字符,它只是東西,這不是一個字符,通常是-1,所以我想這一點,但這並沒有工作,要麼:

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

我敢肯定,這是不可能的。請參閱http://stackoverflow.com/questions/9633577/send-a-eof-in-a-pipe-without-closing-it –

+0

爲什麼你不能關閉輸入流?我在這裏很困惑。 – jcolebrand

+0

因爲我想再次寫入標準輸入。該進程等待EOF,然後在輸入上分塊,然後重新打開/ dev/stdin以等待更多。 –

回答

3

你試過child.stdin.write("\x04");?這是Ctrl + D的ASCII碼。

+0

這是跨平臺?這也可以在Windows上使用嗎? –

+0

我不確定。問題和回答早於Windows上的node.js支持;我從來沒有在Windows環境中運行node.js。在Windows中,「Ctrl + D」是一個信號嗎? – cjohn

+0

我不這麼認爲...... –

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

我在項目中使用這個和它的作品

+1

EOF!= EOL。 EOL可能在Windows上是\ r \ n,在Linux上是\ n。 –

+0

@ joonas.fi yupp –

2

您與res只有兩個線下方做了......

  • stream.write(data)用於當你要繼續書寫
  • stream.end([data])用於當您不需要發送更多數據時(它將關閉流)
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');