一、基礎知識
stderr,全稱為standard error,是Unix和類Unix操作系統中的標準輸出流之一。與標準輸出流stdout不同,它通常用於輸出錯誤信息。
在程序運行時,輸出通常被分為兩類:標準輸出和標準錯誤輸出。標準輸出用於輸出普通信息,標準錯誤輸出則用於輸出錯誤信息。這樣,在程序運行出現錯誤時,我們不必再去查看日誌,錯誤信息可以直接在控制台或終端上輸出。
#include <stdio.h> int main() { fprintf(stderr, "This is an error message.\n"); return 0; }
上面的C語言代碼演示了如何在程序中使用stderr輸出錯誤信息,通過fprintf函數將錯誤信息輸出到stderr中。
二、使用場景
在程序開發和調試過程中,我們經常需要使用stderr輸出一些錯誤信息。一般來說,只有在程序發生錯誤時才輸出錯誤信息。同時,在編寫可重用的函數庫時,可以嘗試通過stderr輸出一些有關於錯誤的描述信息。
當然,有時候我們也可以使用stdout輸出一些調試信息,但是這樣做有一個缺點,即可能會與程序的標準輸出混淆。因此,為了更好地區分標準輸出和調試信息,通常情況下我們使用stderr來輸出錯誤信息。
#include <stdio.h> int main(int argc, char *argv[]) { if (argc != 2) { fprintf(stderr, "Usage: %s <filename>\n", argv[0]); return 1; } // do something return 0; }
上面的C語言代碼演示了如何在程序中使用stderr輸出錯誤信息,比如在沒有傳遞文件名作為命令行參數時輸出使用說明。
三、重定向stderr
有時候,我們可能需要將程序中的錯誤信息輸出到文件中,而不是輸出到控制台或終端上。為此,我們可以使用重定向技術,將stderr輸出到指定的文件中。
在Unix和類Unix操作系統中,可以使用以下命令將stderr輸出重定向到指定的文件中:
./program 2> error.log
這樣,程序中的所有錯誤信息都會被輸出到error.log文件中。
在C語言中,可以使用freopen函數將stderr輸出重定向到指定的文件中:
#include <stdio.h> int main() { FILE *fp = freopen("error.log", "w", stderr); if (fp == NULL) { printf("Failed to open error.log.\n"); return 1; } fprintf(stderr, "This is an error message.\n"); fclose(fp); return 0; }
上面的代碼演示了如何將stderr輸出重定向到error.log文件中,並輸出一條錯誤信息。
四、結合perror函數
perror函數可以用於輸出系統錯誤信息,並且自動將錯誤信息附加在傳遞給它的參數後面。該函數自動將errno變量指向的錯誤碼對應的描述信息輸出到stderr中。
#include <stdio.h> #include <errno.h> int main() { FILE *fp = fopen("file.txt", "r"); if (fp == NULL) { perror("Failed to open file.txt"); return errno; } // do something fclose(fp); return 0; }
上面的代碼演示了如何結合perror函數輸出系統錯誤信息。如果打開文件失敗,調用perror函數輸出錯誤信息,並返回errno變量中存儲的錯誤碼。
五、總結
stderr是Unix和類Unix操作系統中的標準錯誤輸出流。在程序開發和調試中,我們經常需要使用stderr輸出一些錯誤信息。同時,通過重定向技術,我們可以將stderr輸出到指定的文件中。在C語言中,可以使用perror函數輸出系統錯誤信息,並自動將錯誤信息附加在傳遞給它的參數後面。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/252040.html