Windows上是否支持文件描述符?为什么Perl中的东西“看起来有用”,有fds?
“fileno”,“dup”和“dup2”之类的东西正在运行,但随后在其他环境中随机停止工作。很难提供详细信息,主要是我正在寻找的是经验丰富的Windows程序员的答案以及文件描述符在Windows上的工作方式/工作方式。
我猜这是PerlIO层玩游戏并使它看起来好像文件描述符有效,但这只是猜测。
正在发生的事情的例子:
open($saveout, ">&STDOUT") or die();
...
open(STDOUT, ">&=".fileno($saveout)) or die();
第二行die()s但仅在某些情况下(我还没有确定)。
答案 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
猴子的函数?