jjzjj

windows - 不用 tty 访问 COIN$

coder 2024-06-13 原文

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

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/

有关windows - 不用 tty 访问 COIN$的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  3. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  4. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  5. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  6. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  7. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  8. ruby - 有没有办法从 ruby​​ case 语句中访问表达式? - 2

    我想从then子句中访问c​​ase语句表达式,即food="cheese"casefoodwhen"dip"then"carrotsticks"when"cheese"then"#{expr}crackers"else"mayo"end在这种情况下,expr是食物的当前值(value)。在这种情况下,我知道,我可以简单地访问变量food,但是在某些情况下,该值可能无法再访问(array.shift等)。除了将expr移出到局部变量然后访问它之外,是否有直接访问caseexpr值的方法?罗亚附注我知道这个具体示例很简单,只是一个示例场景。 最佳答案

  9. ruby - 从外部访问类的实例变量 - 2

    我理解(我认为)Ruby中类变量和类的实例变量之间的区别。我想知道如何从该类外部访问该类的实例变量。从内部(即在类方法中而不是实例方法中),它可以直接访问,但是从外部,有没有办法做MyClass.class.[@$#]variablename?我没有任何具体原因要这样做,只是学习Ruby并想知道是否可行。 最佳答案 classMyClass@my_class_instance_var="foo"class上述yield:>>foo我相信Arkku演示了如何从类外部访问类变量(@@),而不是类实例变量(@)。我从这篇文章中提取了上述内

  10. ruby-on-rails - 使用 HTTP.get_response 检索 Facebook 访问 token 时出现 Rails EOF 错误 - 2

    我试图在我的网站上实现使用Facebook登录功能,但在尝试从Facebook取回访问token时遇到障碍。这是我的代码:ifparams[:error_reason]=="user_denied"thenflash[:error]="TologinwithFacebook,youmustclick'Allow'toletthesiteaccessyourinformation"redirect_to:loginelsifparams[:code]thentoken_uri=URI.parse("https://graph.facebook.com/oauth/access_token

随机推荐