Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从控制台向node.js stdin发送EOF信号?_Javascript_Node.js - Fatal编程技术网

Javascript 如何从控制台向node.js stdin发送EOF信号?

Javascript 如何从控制台向node.js stdin发送EOF信号?,javascript,node.js,Javascript,Node.js,我有一个简单的node.js应用程序来响应stdin。当我在Windows控制台上以交互方式运行它时,我希望control-Z被识别为EOF信号。但事实并非如此。那么,如何让节点应用程序将control-Z视为EOF呢 // testEcho.js process.stdin.setEncoding('utf-8'); console.log("input is a TTY?:",process.stdin.isTTY); process.stdin.on('readable',functi

我有一个简单的node.js应用程序来响应stdin。当我在Windows控制台上以交互方式运行它时,我希望control-Z被识别为EOF信号。但事实并非如此。那么,如何让节点应用程序将control-Z视为EOF呢

// testEcho.js

process.stdin.setEncoding('utf-8');
console.log("input is a TTY?:",process.stdin.isTTY);

process.stdin.on('readable',function() {
    var vText = process.stdin.read();
    if (vText != null)
        console.log('echo: "%s"',vText);
    process.stdout.write('> '); // prompt for next
    });

process.stdin.on('end',function() { // Works for redirected input but not triggered by ^Z on TTY
    console.log('end of input reached');
    });

```问题是您使用的是
process.stdin.on
而不是
process.on()

看看我在这里做的修复,一切都会好起来的:)享受吧

我还用
'SIGINT'
替换了
'end'
,因为这是
CTRL+C所捕获的信号


您可以在此处阅读有关信号事件的信息:

解决方案似乎是使用
readline
。这更具有终端意识,并将交互式TTY ctrl-D视为EOF,同时正确处理重定向的输入流。此外,由于面向行/感知,它可以方便地从输入字符串中剥离换行符

var readline = require('readline');
process.stdin.setEncoding('utf-8');
console.log("input is a TTY?",process.stdin.isTTY);

var rl = readline.createInterface({input: process.stdin, output: process.stdout});
rl.setPrompt('> ');
rl.prompt();
rl.on('line' ,function(aText) { console.log('echo: "%s"',aText); rl.prompt(); });
rl.on('close',function()      { console.log('input has closed'); /* ... */ });

process.on(“SIGINT”,fn)我在debian上使用node 4.8.2的经验是,当按下ctrl-D时,process.stdin同时发出“end”和“close”。谢谢,但不幸的是control-C终止了进程,而我只是试图发出输入结束的信号,不必停止进程。@MichaelLemaire:ctrl-C会在没有
SIGINT
处理程序的情况下终止进程。一旦您安装了类似于上面的处理程序,ctrl-C就不再终止进程。这就是为什么上面的示例包括
process.exit()
@MichaelLemaire很抱歉误解,我认为不可能为EOF设置侦听器:(@MichaelLemaire-这是一种实用的方法,但您可以查找仅由1a 0d 0a组成的输入行-Windows需要CR-LF组合才能识别^Z。值得注意的是,ctrl-D(而不是ctrl-Z)在Windows上被识别为EOF,但我没意见。Ctrl-D毕竟是ASCII EOT。在Cygwin上似乎不起作用,尝试发送Ctrl+D,但NodeJS使用readline时没有反应。
var readline = require('readline');
process.stdin.setEncoding('utf-8');
console.log("input is a TTY?",process.stdin.isTTY);

var rl = readline.createInterface({input: process.stdin, output: process.stdout});
rl.setPrompt('> ');
rl.prompt();
rl.on('line' ,function(aText) { console.log('echo: "%s"',aText); rl.prompt(); });
rl.on('close',function()      { console.log('input has closed'); /* ... */ });