我很奇怪,爲什麼取消註釋下面的程序首先printf語句改變其後續行爲:標準輸入輸出端子收盤後(STDOUT_FILENO)行爲
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main() {
//printf("hi from C \n");
// Close underlying file descriptor:
close(STDOUT_FILENO);
if (write(STDOUT_FILENO, "Direct write\n", 13) != 13) // immediate error detected.
fprintf(stderr, "Error on write after close(STDOUT_FILENO): %s\n", strerror(errno));
// printf() calls continue fine, ferror(stdout) = 0 (but no write to terminal):
int rtn;
if ((rtn = printf("printf after close(STDOUT_FILENO)\n")) < 0 || ferror(stdout))
fprintf(stderr, "Error on printf after close(STDOUT_FILENO)\n");
fprintf(stderr, "printf returned %d\n", rtn);
// Only on fflush is error detected:
if (fflush(stdout) || ferror(stdout))
fprintf(stderr, "Error on fflush(stdout): %s\n", strerror(errno));
}
如果沒有第一個printf,隨後printf的區域主題網絡34,如果沒有即使從stdout用戶緩衝區到基礎fd的連接已關閉,也會出現錯誤。只有在手動fflush(stdout)上纔會報告錯誤。 但是,隨着第一個printf打開,下一個printf報告錯誤,正如我所期望的那樣。 在兩種情況下STDOUT_FILENO fd都關閉後,終端(通過printf)沒有寫入任何內容。
我知道這是愚蠢的close(STDOUT_FILENO)
在這裏擺在首位;這是一個我偶然發現的實驗,並且認爲某些在這些領域更有知識的人可能會看到我們在其中的一些啓發。
我在Linux上使用gcc。
當你關閉底層描述符'STDOUT_FILENO'時,'stdout'處於不良狀態,''fclose(stdout)'正常工作。 –