我正在将stderr
重定向到Windows Phone Runtime上的日志文件:
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
时,一切似乎都正常。
答案 0 :(得分:2)
这是窗户所以谁知道?
尝试std::cerr.flush();
,因为我完全可以看到Windows再次做自己的事情(比如套接字不像文件,他们喜欢做自己的IO工作)。
使用我刚才所说的将任务放到他们的标准库中,而不是假设它是一个文件等。记住“抽象”,它有意义flush是一种方法,它是一个动词,我们不关心如何(或者在这种情况下不想(想)知道)所以让我们假设同花顺做了什么冲洗应该做什么!
如果这不起作用,请发表评论,我会有一个想法。
我不使用Windows或Windows手机(我不是世界上幸运的24手机之一:P)但是我知道Windows上存在I / O问题(“差异”),幸运的是MinGW并将他们隐藏起来:)
或强>
改变你的策略,如果我真的想侧面解决问题(因为它不是你的代码)创建一个名为my_error_stream的新类或者什么,那就扩展了std :: ostream(这样你可以像std一样使用它:: cerr“是”std :: ostream。“
将一个静态方法放在名为get_error_stream()的东西中,或者返回从my_error_stream派生的两个类中的一个,一个向右转发到std :: err,另一个转发到文件。
这取决于你喜欢你的代码的外观和感觉,我这样说是因为它使实现分开,并在它们自己的类层次结构的“分支”下。
它并没有真正回答你的问题,但你的代码看起来很好,而且Windows很糟糕,管道和套接字。