我刚刚意识到,PerlIO层似乎不仅仅(或多或少)能够轻松地包装stdio.h函数。 如果我尝试使用通过PerlIO_stdout()
解析的PerlIO_stdout()
和使用stdio.h中的函数的PerlIO_stdout()
, PerlIO_fileno()
失败。
例如:
PerlIO* perlStdErr = PerlIO_stderr(); fdStdErrOriginal = PerlIO_fileno(perlStdErr); relocatedStdErr = dup(fdStdOutOriginal); _write(relocatedStdErr, "something", 8); //<-- this fails
我用VC10尝试过这个。 嵌入式perl程序是从不同的上下文执行的 – 因此不可能在执行对relocatedStdErr的写入的上下文中使用PerlIO。
对于好奇:我需要执行一个perl脚本并将脚本的stdout / stderr的输出转发到日志,同时保持为stdout写自己的能力。 此外,这应该工作平台独立(Linux,Windows控制台应用程序,win32桌面应用程序)。 只是转发stdout / stderr在Win32桌面应用程序中不起作用,因为没有;) – 你需要使用perl的stdout / stderr。
需要的解决方案:能够在perlio派生的文件句柄(或描述符)上使用PerlIO堆栈进行写入。
编辑 – 我的解决方案:
正如Story Teller指向PerlIO_findFILE,这就是诀窍。 所以这里是代码的摘录 – 请参阅内部的注释以获取描述:
FILE* stdErrFILE = PerlIO_findFILE(PerlIO_stderr()); //convert to Perl's stderr to stdio FILE handle fdStdErrOriginal = _fileno(stdErrFILE); //get descriptor using MSVC if (fdStdErrOriginal >= 0) { relocatedStdErr = _dup(fdStdErrOriginal); //relocate stdErr for external writing using MSVC if (relocatedStdErr >= 0) { if (pipe(fdPipeStdErr) == 0) //create pipe for forwarding stdErr - USE PERL's IO since win32subsystem(non-console) "_pipe" doesn't work { if (dup2(fdPipeStdErr[1], fdStdErrOriginal) >= 0) //hang pipe on stdErr - USE PERL's IO (since it's created by perl) { close(fdPipeStdErr[1]); //close the now duplicated writer on stdErr for further usage - USE PERL's IO (since it's created by perl) //"StreamForwarder" creates a thread that catches/reads the pipe's input and forwards it to the processStdErrOutput function (using the PerlIO) stdErrForwarder = new StreamForwarder(fdPipeStdErr[0], &processStdErrOutput, PerlIO_stderr()); return relocatedStdErr; //return the relocated stdErr to be able to '_write' onto it } } } } ... ... _write(relocatedStdErr, "Hello Stackoverflow!", 20); //that works :)
我实际上不明白的一个有趣的事情是,perl文档说没有必要#define PERLIO_NOT_STDIO 0
才能使用PerlIO_findFILE()
。 但是对我来说,如果没有它,它可以正常工作,而且我还是喜欢将PerlIO和stdio一起使用。 这是我没有弄清楚发生了什么的一点。
以上就是c/c++开发分享嵌入式perl in C,perlapio – 与STDIO的互操作性相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/562331.html