perl - 支持自动激活文件句柄作为 Perl XS 例程的参数

标签 perl filehandle xs

问题

如何在 XS 函数中支持自动激活的文件句柄参数?

我正在 XS 包装一个返回文件描述符的 C 函数,我想以 open() 的方式将该文件描述符呈现为 perl 文件句柄参数.例如。,

myfunc(my $fh) or die "Error: $!";
do_something_with_fh($fh);

到目前为止我所做的

现在我在 XS 函数之上使用 perl 包装器:
# -- in perl
sub myfunc {
    my $fd = _myfunc();
    return open($_[0], '+<&=', $fd) if defined($fd);
}

/* -- in XS */
SysRet
_myfunc()
    CODE:
    RETVAL = some_c_function_returning_an_fd();

    OUTPUT:
    RETVAL

这很好用(tm),但是,我想再次将实现完全移到 XS 中。

到目前为止,我已经尝试过 sv_2io在类型映射为 SV * 的参数上,但这会在未定义的标量上引发异常。我没有尝试将第一个参数映射到 FILE *PerlIO *对象,因为我不知道如何“fdreopen”(如果您愿意的话)这些对象。

最佳答案

我会保留 myfunc() Perl 中的包装器,它可以工作并且不应该成为瓶颈。

重新实现 open()很棘手,需要使用未记录的/内部 API。我认为这是一个非常接近的实现。 newGVgen()do_openn()是公共(public) API 的一部分,但未记录和 subject to change .

void
myfunc(sv)
    SV *sv
  PPCODE:
    {
        GV *gv = newGVgen("Mypackage");
        SV *rv = sv_2mortal(newRV_noinc((SV *)gv));
        SV *fd = sv_2mortal(newSViv(some_c_function_returning_an_fd()));

        if (!do_openn(gv, "+<&=", 4, FALSE, 0, 0, NULL, &fd, 1))
            croak("Could not fdopen descriptor: '%s'", Strerror(errno)); /* or XSRETURN_NO; */

        sv_setsv(sv, rv);
        SvSETMAGIC(sv);
        XSRETURN_YES;
    }

关于perl - 支持自动激活文件句柄作为 Perl XS 例程的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13996719/

相关文章:

ant错误无法将旧文件重命名为临时文件

perl - 如何通过 sudo (或作为另一个用户)打开 Perl 文件句柄写入数据

raku - Perl 6 的 eof 是否放弃得太快了?

c - 如何在 C 代码中构建 Perl 哈希?

perl - 如何将 CV 分配给带有操作码列表的包?

Perl 目录、文件排序、带大小和日期的打印列表

windows - 您如何构建针对 Windows 的 perl 源代码?

javascript - 从 php 执行 Perl 文件

perl - 如何从用户代码中使用 perldb 的 x 命令?