添加带有自定义标准错误的fprintf()语句后,标准输出挂起

时间:2012-01-19 13:47:30

标签: c++ c stdout stderr buffering

我有一个带有成员函数Archive的C ++类extractData()。此函数调用realExtractData(),它在单独的C库中实现。

我希望将extractData()函数传递给FILE *stdout stderr个实例,但我希望提供自定义文件指针选项,以及:

class Archive {
    public:
        ...
        int extractData(string id, FILE *customOut, FILE *customErr);
        ...
};

int
Archive::extractData(string id, FILE *customOut, FILE *customErr)
{
    if (realExtractData(id.c_str(), customOut) != EXIT_SUCCESS) {
        fprintf(stderr, "something went wrong...\n");
        return EXIT_FAILURE;
    }
    return EXIT_SUCCESS;
}

如果按照列出的方式调用上述内容,则将数据输出到标准输出没有延迟。所有提取的数据几乎立即发送到标准输出(stdout):

FILE *outFp = stdout;
FILE *errFp = stderr;
Archive *archive = new Archive(inFilename);

if (archive->extractData(id, outFp, errFp) != EXIT_SUCCESS) {
    fprintf(errFp, "[error] - could not extract %s\n", archive->getInFnCStr());
    return EXIT_FAILURE;
}

如果我更改extractData()以使其fprintf()来电使用customErr

int
Archive::extractData(string id, FILE *customOut, FILE *customErr)
{
    if (realExtractData(id.c_str(), customOut) != EXIT_SUCCESS) {
        fprintf(customErr, "something went wrong...\n");  /* <-- changed this line */
        return EXIT_FAILURE;
    }
    return EXIT_SUCCESS;
}

...然后当我运行二进制文件时,二进制文件似乎在处理输入和打印到标准输出时挂起。

如果我将fprintf()更改回使用stderr而不是customErr,那么事情再次正常工作,,数据会刷新到标准输出(我的customOut)立即。

这是一个缓冲问题吗?有办法解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

“stderr而非customErr”

标准错误是非缓冲的,这意味着它几乎立即打印出来。其他输出流是缓冲的,除非您使用的是低级操作系统调用,这意味着它们需要更长时间才能打印,除非您使用endl,:: flush或其他任何东西进行缓冲区刷新。

如果您想要进行低级操作系统调用,并且您正在使用unix,请查看以下内容:

http://www.annrich.com/cs590/notes/cs590_lecture_2.pdf

我还没有阅读整篇文章,但是在扫描它时,看起来好像它与Unix中的史蒂文斯高级编程书有着相似的信息,而这本书就是在讨论这个问题。