我是XS初学者,我正在研究更改现有的XS模块,该模块大量使用15年以上的底层C库(实际上,该模块基本上只是与该库粘合)。问题是我希望能够使用PerlIO字符串欺骗手段,例如:

open($fh, '<', \$string);

然后将$fh传递到库期望FILE的XS胶水。问题在于XS具有:
int
_parse (entry_ref, filename, file, preserve=FALSE)
    SV *    entry_ref;
    char *  filename;
    FILE *  file;
    boolean preserve;

我认为它必须是:
PerlIO *  file;

当然这是行不通的,因为它必须有更多的功能。当我查看库中的_parse代码时,它的结尾为:
AST * bt_parse_entry (FILE *    infile,
                      char *    filename,
                      btshort    options,
                      boolean * status)
{
   AST *         entry_ast = NULL;
   static int *  err_counts = NULL;
   static FILE * prev_file = NULL;

再次使用FILE类型。现在,我必须开始的基本问题是-在不更改库的情况下是否有可能实现?也就是说,是否仅通过更改XS就可以从字符串PerlIO行为中获取伪文件句柄?

最佳答案

Perl API提供了 PerlIO_exportFILE() (Implementation),可以将带有文件描述符的PerlIO句柄转换为stdio FILE指针。由于PerlIO::Scalar是没有文件描述符的“内存中”文件句柄,因此转换无法成功。传递PerlIO::Scalar句柄的唯一可移植方法是将其刷新到临时文件。较不便于移植的方法是使用支持回调的stdio,例如BSD实现funopen(3)

09-30 17:26