16

ストリームを閉じずに EOF をストリームに通知するにはどうすればよいですか?

標準入力で入力を待機するスクリプトがあり、ctrl-d を押すと、出力が標準出力に吐き出され、ctrl-d を押すまで再び標準入力を待機します。

私のnodejsスクリプトでは、そのスクリプトを生成し、stdinストリームに書き込み、ストリームを閉じずに何らかの方法で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(...) に変更すると、機能しますが、1 回だけです。その後、ストリームは閉じられます。EOF は実際には文字ではなく、通常は -1 の文字ではないことをどこかで読んだので、これを試しましたが、これもうまくいきませんでした:

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

3 に答える 3

6

試しましたchild.stdin.write("\x04");か?これは Ctrl+D のアスキー コードです。

于 2013-08-16T03:19:56.627 に答える
3

以下の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');
于 2016-10-19T13:09:46.553 に答える