gpt4 book ai didi

windows - 不用 tty 访问 COIN$

转载 作者:可可西里 更新时间:2023-11-01 10:36:40 24 4
gpt4 key购买 nike

我正在尝试访问从控制台接收输入的文件描述符。我目前正在使用

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 中绑定(bind)到这个 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, syscall: read

最佳答案

查看 Node 存储库似乎很明显,new _TTY(fd, true) 需要一个 C 文件描述符,但您传递给它的是 Win32 句柄。

_open_osfhandle函数从句柄创建文件描述符。

所以,你应该试试

var t = new _TTY(_open_osfhandle(fd), true);

(如评论中所述,这仅在您与 libuv 共享 C 运行时时才有效。)

理想情况下,您会使用 libuv 的 open 函数,但不幸的是 fs__open 中存在一个错误:

  case _O_RDWR:
access = FILE_GENERIC_READ | FILE_GENERIC_WRITE;

这是它决定请求哪些访问权限的地方。 FILE_GENERIC_WRITE 和 FILE_GENERIC_READ 顾名思义,是特定于文件的,不能用于打开 CONIN$。应该是

  case _O_RDWR:
access = GENERIC_READ | GENERIC_WRITE;

这将适用于文件和其他类型的对象,例如控制台输入和输出。 (我在一个简单的 C 程序中复制了它;在我的系统上,使用 FILE_* 权限肯定会阻止您打开 CONIN$。)

关于windows - 不用 tty 访问 COIN$,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22511835/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com