我将重定向stderr
到Windows Phone运行时上的日志文件:
int stdError = 0;
FILE* pLogFile = NULL;
// Redirect stderror to a logfile
if ( ! m_logFilePath.empty( ) )
{
// Get a duplicate file descriptor for stderror
// This returns -1 on failure
stdError = ::_dup( ::_fileno( stderr ) );
if ( stdError != -1 )
{
// Redirect stderror to a log file so we can capture
// ffmpeg error information
// Ignore the return value (nothing we can do if this fails)
::freopen_s( &pLogFile, m_logFilePath.c_str( ), "w", stderr );
}
}
调用时,程序间歇性崩溃fflush(stderr);
。当我不重定向时,stderr
一切似乎都工作正常。
是窗户,谁知道呢?
尝试一下,std::cerr.flush();
因为我完全可以看到Windows再次做自己的事情(就像套接字不像文件一样,它们喜欢做自己的IO工作)。
使用我上面所说的内容,可以将任务放入其标准库中,而不是假定它是文件之类的东西。记住“抽象”,有意义的意思是flush是一种方法,它是一个动词,我们不在乎如何(或者在这种情况下(不想)知道),所以让我们假设一下flush做了flush应该做什么!
如果这不起作用,请发表评论,我会考虑一下。
我不使用Windows或Windows Phone(我不是世界上最幸运的24个人之一:P),但是我知道Windows上存在I / O问题(“差异”),所幸的是MinGW和共同隐藏他们来自我:)
要么
更改策略,如果我真的想回避问题(因为它不是您的代码),请创建一个名为my_error_stream之类的新类,该类扩展了std :: ostream(这样您就可以像std :: cerr那样使用它其中“是” std :: ostream)。
将静态方法放在称为get_error_stream()的方法中,或将其返回从my_error_stream派生的两个类之一的方法中,一个将权转发给std :: err,另一个将权转发给文件。
这取决于您希望代码的外观和感觉,我这样说是因为它使实现保持独立,并在类层次结构的自己“分支”之下。
它并不能真正回答您的问题,但是您的代码看起来不错,Windows很烂管道和套接字。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句