gpt4 book ai didi

perl - 在 EV (perl) 中使用合成文件句柄

转载 作者:行者123 更新时间:2023-12-02 01:48:46 29 4
gpt4 key购买 nike

我有一个这样创建的文件句柄对象(为清楚起见略作编辑):

sub TIEHANDLE
{
return $_[0] if ref($_[0]);
my $class = shift;
my $self = bless Symbol::gensym(), $class;
return $self;
}

sub new
{
my ($class, $fh, $chunk, $interval, $cb) = @_;

my $self = bless Symbol::gensym(), ref($class) || $class;
tie *$self, $self;

my $data = {
fh => $fh,
};

${*$self}{'data'} = $data;

return $self;
}

sub fileno
{
my $self = $_[0];
return ${*$self}{'data'}->{'fh'}->fileno();
}

*FILENO = \&fileno;

我想将它与 AnyEvent 一起使用.它适用于 AnyEvent::Impl::Perl但失败了 AnyEvent::Impl::EV .我想我已经从 EV 追踪到这个方法:

static int
s_fileno (SV *fh, int wr)
{
dTHX;
SvGETMAGIC (fh);

if (SvROK (fh))
{
fh = SvRV (fh);
SvGETMAGIC (fh);
}

if (SvTYPE (fh) == SVt_PVGV)
return PerlIO_fileno (wr ? IoOFP (sv_2io (fh)) : IoIFP (sv_2io (fh)));

if (SvOK (fh) && (SvIV (fh) >= 0) && (SvIV (fh) < 0x7fffffffL))
return SvIV (fh);

return -1;
}

我认为它未通过 SvTYPE (fh) == SVt_PVGV 测试。使用 Devel::Peek我得到的 Dump() 方法:

SV = PVMG(0x9c98460) at 0x44313b0
REFCNT = 1
FLAGS = (PADMY,ROK)
IV = 0
NV = 0
RV = 0x9c21d00
SV = PVGV(0x9c35510) at 0x9c21d00
REFCNT = 1
FLAGS = (OBJECT,RMG,MULTI)
MAGIC = 0x9a68ee0
MG_VIRTUAL = &PL_vtbl_backref
MG_TYPE = PERL_MAGIC_backref(<)
MG_OBJ = 0x9c217a8
STASH = 0x4374440 "MetadataStream"
NAME = "GEN5"
NAMELEN = 4
GvSTASH = 0x25d01c8 "Symbol"
GP = 0x9a43d50
SV = 0x0
REFCNT = 1
IO = 0x9c214a8
FORM = 0x0
AV = 0x0
HV = 0x9c21ce8
CV = 0x0
CVGEN = 0x0
LINE = 102
FILE = "/usr/share/perl5/Symbol.pm"
FLAGS = 0x2
EGV = 0x9c21d00 "GEN5"
PV = 0x9c21d00 ""
CUR = 0
LEN = 0

任何关于如何调整句柄的创建以使其能够通过此测试的帮助都将不胜感激。

最佳答案

绑定(bind)的文件句柄仅在 perl 中部分实现,并且不起作用与电动汽车。绑定(bind)句柄不能与事件库一起工作general:虽然某些特定情况可能有效,但在大多数情况下使用句柄,它们不能工作,因为一个的就绪通知底层文件描述符与就绪通知无关系紧的 Handlebars 。

如果您的目标只是对真实文件进行包装描述符,那么一种方法是复制 IO::Handle 和/或FileHandle 做(非常丑陋,但在 perl 中唯一有效的方法),或使用他们作为基类。这不允许你做有趣的事情例如 Hook 读取和写入,但 Hook 它们的机会使它们与事件库不兼容。

另一种方法是实现 perlio 层 (PerlIO::via)。在我的经验,这个模块有点脆弱,但给你所有的选项。同样,如果您引入缓冲或更有趣的东西将文件描述符与实际 I/O 分离,那么就不能工作。

最后,如果你想添加一个新类型的句柄,那么你可以创建一种新的观察者类型。这可以像拥有一个功能一样简单my_handle_io_watcher 获取您的句柄,检查是否准备就绪并创建所需的那种低级观察者。

关于perl - 在 EV (perl) 中使用合成文件句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24009981/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com