簡體   English   中英

添加帶有自定義標准錯誤的fprintf()語句后,標准輸出掛起

[英]Standard output hangs after adding fprintf() statement with custom standard error

我有一個帶有成員函數extractData()的C ++類Archive 此函數調用realExtractData() ,該函數在單獨的C庫中實現。

我想將一對通常通常為stdoutstderrFILE *實例傳遞給extractData()函數,但是我也想提供自定義文件指針的選項:

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 )。

這是一個緩沖問題嗎? 有沒有辦法解決這個問題?

“ stderr而不是customErr”

標准錯誤沒有緩沖,這意味着它幾乎立即打印出來。 除非使用低級OS調用,否則將緩沖其他輸出流,這意味着除非您使用endl,:: flush或其他方法進行緩沖區刷新,否則它們將花費更長的時間打印。

如果您要進行低級OS調用並且正在使用UNIX,請查看以下內容:

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

我還沒有讀完整的書,但是在掃描它時,它似乎具有與Unix優秀的Stevens Advanced Programming書類似的信息,該書對此進行了詳盡的論述。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM