如何从Perl中的fileno获取文件句柄?

时间:2014-08-16 06:33:22

标签: multithreading perl

我正在使用使用threadsthreads::shared的Perl脚本。我想从一个由单独的线程打开的文件句柄中读取,但threads::shared不能将其作为共享标量的值来承认。

我想也许我可以简单地将fileno的结果分享到另一个线程,然后让它读取它。问题是我不知道如何处理这个数字。如果答案在文档中,我可能不会找到正确的东西,因为我还没有找到它。 如何从fileno值获取实际文件句柄?

如果那不可能,有没有办法在创建两个线程后打开并将文件句柄传递给另一个线程?

提前感谢任何建议。

2 个答案:

答案 0 :(得分:5)

使用open

  

如果指定'<&=X',其中X是文件描述符编号或文件句柄,则Perl将执行该文件描述符的C fdopen的等效操作

my $fileno = 0;
open(my $stdin, "<&=$fileno");   # 2-argument form
open(my $stdin, "<&=", $fileno); # or use 3-argument form

如果您更喜欢面向对象的方法,可以使用IO::Filefdopennew_from_fd方法(如Borodin指出的那样):

use IO::File;
my $stdin = IO::File->new_from_fd($fileno, 'r');

答案 1 :(得分:2)

正如@cjm所说,你需要在档案号码上拨打fdopen

但使用IO::Handle中的fdopen方法会更简单,更易读。

看起来像这样

my $fh = IO::File->new;
$fh->fdopen($fileno, 'r');

请注意,IO::File(哪个子类IO::Handle)是按照Perl 5版本14及更高版本按需加载的,所以除非你有use IO::File,否则不需要{{1}}很老的Perl安装。