【问题标题】:How can I obtain a file handle from its fileno in Perl?如何从 Perl 中的 fileno 获取文件句柄?
【发布时间】:2014-08-17 04:54:14
【问题描述】:

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

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

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

提前感谢您的任何建议。

【问题讨论】:

  • 您是否使用现代方法打开文件?打开我的 $file, '
  • 是的。然后我从fileno($file) 获取值并将其传递给不同的线程。
  • 这可能对你有帮助:stackoverflow.com/questions/12696375/…

标签: multithreading perl


【解决方案1】:

使用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');

【讨论】:

    【解决方案2】:

    正如@cjm 所说,您需要在文件号上调用fdopen

    但使用来自IO::Handlefdopen 方法更直接、更易读。

    看起来像这样

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

    并注意IO::File(它是IO::Handle 的子类)随Perl 5 版本14 及更高版本按需加载,因此您不需要use IO::File,除非您安装了非常旧的Perl。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-19
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 2015-05-22
      • 2014-05-22
      相关资源
      最近更新 更多