列印錯誤輸出perror strerror

2021-06-19 01:40:48 字數 2400 閱讀 4321

errno是乙個由posix和iso c標準定義的符號,看(用)起來就好像是一 個整形變數。當系統呼叫或庫函式發生錯誤的時候,比如以唯讀方式開啟乙個不存在的檔案時,它的值將會被改變,根據errno值的不同,我們就可以知道自己 的程式發生了什麼錯誤,然後進行相應的處理。

為什麼,要強調errno看起來好像是乙個整形變數 呢?因為有的標準(如iso c)只規定了errno的作用,而沒有規定它的實現方式,它可能被定義成乙個變數,也有可能被定義成乙個巨集,這個具體要看編譯器自己的實現。早些時 候,posix.1曾把errno定義成extern int errno這種形式,但現在這種方式比較少見了。因為以這種形式來實現errno,在多執行緒環境下errno變數是被多個執行緒共享的,這樣可能執行緒a發生 某些錯誤改變了errno的值,執行緒b雖然沒有發生任何錯誤,但是當它檢測errno的值的時候,執行緒b會以為自己發生了錯誤。所以現在errno在 linux中被實現成extern int * __errno_location(void): #define errno (*__errno_location()),這樣每個執行緒都有自己的errno,不會再發生混亂了。

perror和strerror函式都是用來列印錯誤提示資訊的,它們的原型分別是:

char *strerror(int errnum);

它返回errnum的值所對應的錯誤提示資訊,例如errnum等於12的話,它就會返回"cannot allocate memory"。

void  perror(const char *s);

它先列印s指向的字串,然後輸出當前errno值所對應的錯誤提示資訊,例如當前errno若為12,呼叫perror("abc"),會輸出"abc: cannot allocate memory"。

關於errno有三點需要特別注意:

1、如果系統呼叫或庫函式正確執行的話,errno的值是不會被清零

(置 0,注意這裡是不會被清零,不是不會被改變)的,假若執行函式a的時候發生了錯誤errno被改變,接下來直接執行函式b,如果函式b正確執行的 話,errno還保留函式a發生錯誤時被設定的值。所以,在利用errno之前,最好先對函式的返回值進行判斷,看是否發生了錯誤,返回值錯誤再利用 errno判斷時**發生了錯誤。所以如果乙個函式無法從返回值上判斷正誤,而只能通過errno來判斷出錯,那你在呼叫它之前

必須手動將errno清零

2、系統呼叫或庫函式正確執行,並不保證errno的值不會被改變!

3、任何錯誤號(即發生錯誤時errno的取值)都是非0的。

綜上所述,當需要用errno來判斷函式是否正確執行的時候,最好先將errno清零,函式執行結束時,通過其返回值判斷函式是否正確執行,若沒有正確執行,再根據errno判斷時**發生了錯誤。

erron unix/linux出錯資訊返回值

#include // void perror(const char *msg);

#include // char *

strerror

(int errnum);

#include //errno

errno 是錯誤**,在 errno.h標頭檔案中;

strerror 是通過引數 errnum (就是errno),返回對應的錯誤資訊。

以下是測試程式:

// p_str_error.c

// perror , strerror 函式 , errno 測試

#include

#include

#include

#include

int main(int argc, char *argv)

file *fp;

char *buf;

if( (fp = fopen(argv[1], "r")) == null)

perror("perror"); // 好方便

errno = 12;

printf("strerror: %s\n", strerror(errno)); //轉換錯誤碼為對應的錯誤資訊

exit(1);

perror("perror");

errno = 13;

printf("strerror: %s\n", strerror(errno));

fclose(fp);

return 0;

輸入乙個存在的檔名,如:./a.out 111

open失敗則會輸出:

perror: no such file or directory

strerror: cannot allocate memory

open成功則會輸出:

perror: success

strerror: permission denied

很明顯,perror資訊是由 perror函式輸出的了,第二行是 strerror通過將 errno 輪換成對應的錯誤資訊列印出來。

php列印錯誤日誌到本地,php怎樣列印錯誤日誌

php列印錯誤日誌的方法 1 編輯php fpm.conf配置檔案 2 修改php.ini配置檔案 3 重啟php fpm 4 在指令碼中新增 ini set display errors 0 具體方法 1 修改php fpm.conf配置檔案catch workers output yes err...

PowerDesigner列印錯誤怎麼解決?

這玩意兒是因為有個列印服務 print spooler 這玩意是服務的顯示名稱,真實的服務名稱是spooler 被關閉了,啟動起來就行了。一般是萬惡的xx衛士在幫你優化的時候,會將你的很多重要但是不常用的服務關掉,導致不能用。方式一 在管理員身份執行的命令列視窗執行 net start spoole...

php如何輸出提示錯誤資訊 php列印錯誤資訊

顯示php開始錯誤資訊 display startup errors on 日誌記錄錯誤資訊 log errors on 方法二 需要除錯的php 檔案頭部加入ini set display errors 1 錯誤資訊 ini set display startup errors 1 php啟動錯誤...