1

Windows 是否支持文件描述符?为什么使用 fds 在 Perl 中“似乎工作”?

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

我猜想是 PerlIO 层在玩游戏并让它看起来好像文件描述符工作,但这只是一个猜测。

正在发生的事情的例子:

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

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

4

1 回答 1

1

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

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

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

这是有效的,因为in perlfunc的文档open提供了:

如果您使用 3-arg 形式,那么您可以传递一个数字、文件句柄的名称或正常的“对 glob 的引用”。</p>

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

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

这产生

prog.pl: open: foo.pl 第 2 行的错误文件描述符。

根据(因为您使用而不是)的文档_fdopen,它有两种故障模式:>&=>&

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

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

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

于 2010-07-03T13:01:43.803 回答