16

如何在不关闭流的情况下向流发送 EOF 信号?

我有一个等待标准输入的脚本,然后当我按下 ctrl-d 时,它会将输出吐到标准输出,然后再次等待标准输入,直到我按下 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);
4

3 回答 3

6

你试过child.stdin.write("\x04");吗?这是 Ctrl+D 的 ascii 代码。

于 2013-08-16T03:19:56.627 回答
3

你只用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 回答
0
var os = require("os");    
child.stdin.write("hello child\n");
child.stdin.write(os.EOL);

我在我的项目中使用它并且它有效

于 2015-07-09T13:20:08.337 回答