Perl文件描述符如何在Windows上运行?

时间:2010-02-09 16:51:09

标签: windows perl file-descriptor

Windows上是否支持文件描述符?为什么Perl中的东西“看起来有用”,有fds?

“fileno”,“dup”和“dup2”之类的东西正在运行,但随后在其他环境中随机停止工作。很难提供详细信息,主要是我正在寻找的是经验丰富的Windows程序员的答案以及文件描述符在Windows上的工作方式/工作方式。

我猜这是PerlIO层玩游戏并使它看起来好像文件描述符有效,但这只是猜测。

正在发生的事情的例子:

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

第二行die()s但仅在某些情况下(我还没有确定)。

1 个答案:

答案 0 :(得分:1)

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

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

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

这是有效的,因为documentation for open in perlfunc提供了:

  

如果使用3-arg表格,则可以传递数字,文件句柄的名称或普通的“对glob的引用”。

最后,当您致电die时,始终会包含有意义的诊断信息!下面的程序标识自己($0),告诉它尝试做什么(open),以及它失败的原因($!)。此外,由于邮件不以换行符结尾,die会添加文件的名称和调用它的行号。

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

这会产生

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

根据documentation for _fdopen(因为您使用了>&=而不是>&),它有两种失败模式:

  

如果允许继续执行,则errno设置为EBADF,表示文件描述符错误,或EINVAL,表示该模式为空指针。

第二个是perl中的一个错误并且极不可能,因为我在perlio.c中没有看到涉及计算模式的任何地方:它们都是静态字符串。

$saveout似乎出现了问题。在尝试恢复之前$saveout是否已关闭?从您的示例中,不清楚您是否启用了strict编译指示。如果它不是词法(用my声明),你是否正在调用一个同时具有$saveout猴子的函数?