fflush on stderrr会导致程序崩溃

时间:2013-10-08 21:19:23

标签: c++ windows windows-phone-8 stderr fflush

我正在将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时,一切似乎都正常。

1 个答案:

答案 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很糟糕,管道和套接字。