我正在尝试访问从控制台接收输入的文件描述符。我目前正在使用
HANDLE fd = CreateFile(
"CONIN$",
GENERIC_READ | GENERIC_WRITE,
TRUE,
0,
OPEN_EXISTING,
0,
0);
SetConsoleMode(fd, ENABLE_WINDOW_INPUT);
并将 fd 返回到从控制台读取(基于 libuv)输入的程序。
当进程在控制台中执行时,这工作正常,但是当我将输入管道输入到程序中时,从 fd 读取崩溃
echo hello | inputProgram
我怀疑没有与输入过程关联的控制台,但我不确定。以这种方式执行时,如何正确地将输入读入 cmd 窗口?
所以我在 Node.js 中绑定到这个 C++ 程序。我打电话
var ReadStream = require("tty").ReadStream();
var TTY = process.binding("tty_wrap").TTY;
module.exports = function () {
var opentty = require("./bin/opentty.node") // program returns the fd int
var fd = opentty();
var t = new _TTY(fd, true);
return new ReadStream(t);
}
opentty 在文件句柄的重定向输入模式下返回 3。处理这个文件句柄的代码可以在这里找到
https://github.com/joyent/node/blob/master/src/tty_wrap.cc#L185
本质上是uv_tty_init
在这里找到的
https://github.com/joyent/node/blob/master/deps/uv/src/win/tty.c#L99
流错误Error: read EBADF
,系统调用:读取