代码之家  ›  专栏  ›  技术社区  ›  dlamotte

Perl文件描述符在Windows上是如何工作的?

  •  0
  • dlamotte  · 技术社区  · 15 年前

    windows是否支持文件描述符?为什么在Perl中,fds“似乎起作用”?

    像“fileno”、“dup”和“dup2”这样的东西都在工作,但在其他环境中却随机停止了工作。很难给出细节,主要是我在寻找经验丰富的Windows程序员的答案,以及文件描述符如何在Windows上工作/不工作。

    我猜是PerlIO层在玩游戏,让人觉得文件描述符起作用,但那只是猜测。

    正在发生的事情的示例:

    open($saveout, ">&STDOUT") or die();
    ...
    open(STDOUT, ">&=".fileno($saveout)) or die();
    

    第二行die()s,但仅在某些情况下(我尚未确定)。

    1 回复  |  直到 15 年前
        1
  •  1
  •   Greg Bacon    15 年前

    Windows本机使用文件描述符。见 Low-Level I/O 在MSDN上。它们都通过C变量报告错误 errno ,这意味着它们出现在Perl的 $! .

    请注意,您可以省去一些打字:

    open(STDOUT, ">&=", $saveout) or ...;
    

    这样做是因为 documentation for open in perlfunc 提供:

    如果使用3-arg形式,则可以传递数字、文件句柄的名称或对glob

    最后, 总是 调用时包含有意义的诊断 die ! 下面的程序标识自己( $0 ),告诉它要做什么( 打开 ),以及失败的原因( 元! ). 另外,因为消息没有以换行符结尾, 死亡 添加调用文件的文件名和行号。

    my $fakefd = 12345;
    open(STDOUT, ">&=", $fakefd) or die("$0: open: $!");
    

    这就产生了

    prog.pl: open: Bad file descriptor at foo.pl line 2.

    根据 documentation for _fdopen (因为你用 >&= 而不是 >& ),它有两种故障模式:

    如果允许继续执行, 厄尔诺 设置为 EBADF ,指示错误的文件描述符,或 EINVAL ,指示模式为空指针。

    第二个可能是perl中的一个错误,而且非常不可能,因为我在 perlio.c 这涉及到计算模式:它们都是静态字符串。

    好像出了什么问题 $saveout . 能 节省美元 在你试图恢复之前已经关闭了吗?从您的示例中,不清楚您是否启用了 strict 布拉格马。如果不是词法(声明为 my ),是否调用一个函数 节省美元 ?