在Perl中,我如何通过文件描述符获取文件句柄?

3
我正在使用一个Perl脚本,它使用了threadsthreads::shared。我想从由另一个线程打开的文件句柄中读取,但是threads::shared不能将其作为共享标量的值。
我想也许我可以简单地共享fileno的结果给其他线程,然后让它读取它。问题是我不知道该怎么做。如果答案在文档中,我可能没有找到正确的东西。如何从fileno值获取实际的文件句柄?
如果这不可能,是否有一种方法在创建两个线程后打开并传递文件句柄?
提前感谢任何建议。

你用现代方法打开文件了吗?打开我的 $file, '<', 'filename'。 - Miguel Prz
是的。然后我从 fileno($file) 获取值并将其传递给另一个线程。 - Francisco Zarabozo
这是关于编程的相关内容,请将其从英语翻译成中文。仅返回已翻译的文本:这些可能会对你有所帮助:http://stackoverflow.com/questions/12696375/perl-share-filehandle-with-threads - Miguel Prz
2个回答

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

3

正如@cjm所说的那样,你���要在文件号码上调用fdopen

但是使用来自IO::Handlefdopen方法更加简单直观和易读。

代码如下:

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

请注意,IO::File(它是IO::Handle的子类)在Perl 5版本14及更高版本上会按需加载,因此除非您使用的是非常旧的Perl安装程序,否则不需要use IO::File

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接