項目日志——輸出重定向前言
在處理輸出重定向時,需要了解stderr和stdout的不同緩存機制。stderr是不進行緩存的,而stdout則是進行行間緩存,即在遇到換行符(n)時才進行輸出。以下是一個示例,展示了這種差異:
#include <stdio.h> #include <unistd.h> <p>int main(int argc, char** argv) { for(int i = 0; i < 10; i++) { printf("stdout: %dn", i); // 標準輸出 fprintf(stderr, "stderr: %dn", i); // 標準錯誤輸出 sleep(1); // 暫停一秒 } return 0; }
可以觀察到,第一個循環(stdout)的內容會在遇到換行符后一次性輸出,而第二個循環(stderr)的內容則會逐行輸出。
重定向操作有時會用于將調試信息保存到文件中,以便在終端關閉后仍然可以查看信息。以下是幾種常見的重定向操作:
將標準輸出重定向到文件:
./test > test.txt
將標準輸入和標準錯誤輸出重定向到文件:
./test 1 > testout.txt 2 > testerr.txt
以追加方式重定向到文件,例如將標準輸入和標準錯誤輸出追加到文件中:
./test >> test1.txt 2>&1
在代碼中實現重定向操作:
#include <stdio.h></p><p>int main(void) { FILE *out = freopen("stdout.txt", "w", stdout); printf("%sn", "redirect test"); return 0; }
在生產環境中,通常會將stdin、stdout和stderr這三個流重定向到其他文件中。日志中最好包含日期、時間和文件等信息。需要注意的是,printf涉及到文件操作,可能會引起IO中斷(進行一系列系統調用),因此執行printf的效率比一般指令低很多。一般情況下,不建議使用printf。