这个问题或多或少与C 中的嵌入式 perl perlapio 有关 -我认为我已经为 Windows 环境解决了与 STDIO 的互操作性。如果这个新问题也得到解决,我将发布一个完整的解决方案。
在链接的问题中,
StoryTeller 给了我
使用PerlIO_findFILE()
解决直接问题的提示,但是 Linux 上的相同代码表现得很奇怪。
Perldup2()
在 Win32 上似乎有不同的行为,其中dup2()
是一个宏 for win32_dup2()
,据我所知,它只是使用dup2()
from io.h
。
在 Win32 上,Perl 的版本在成功时返回零,在错误时返回非零,但在 Linux 上,dup2()
将使用默认的 ANSI,而是返回新的文件描述符。然后,我将不得不检查errno
一切是否正常。
如果调用PerlIO_findFILE()
设置errno
为“非法搜索”(errno 29 - ESPIPE
),那么 after dup
、dup2
等仍然设置为“非法搜索”,并且任何进一步的检查仍然会看到相同的错误pipe
。errno
errno
(实际上,一切都对我有用,因为没有实际错误。此外,通过检查的解决方案errno
不是线程安全的,因为在系统调用和检查之间,另一个线程可能会重置 errno。)
请注意,我有
#define PERLIO_NOT_STDIO 0
实际上,我正在使用 Perl5.14.1。
我在这里做错了什么吗?
这是一个简化的代码片段:
stdOutFILE = PerlIO_findFILE(PerlIO_stderr()); // convert Perl's stdout to stdio FILE handle
fdStdOutOriginal = fileno(stdOutFILE); // get descriptor
if ( fdStdOutOriginal >= 0 ) {
relocatedStdOut = dup(fdStdOutOriginal); // relocate stdOut for external writing
if ( relocatedStdOut >= 0 )
{
if ( pipe(fdPipeStdOut) == 0 ) // create pipe for forwarding to stderr
{
// this has to be done on win32:
// if ( dup2(fdPipeStdOut[1], fdStdOutOriginal) == 0 ) // hang pipe on stdOut
dup2(fdPipeStdOut[1], fdStdOutOriginal);
if( errno == 0 ) {
// do some funny stuff
} else {
// report error
}
}
}
}