linux c 系統報錯

來源:互聯網
上載者:User

標籤:style   io   ar   color   使用   sp   on   檔案   div   

本文中的錯誤是指在代碼編譯完全正確程式可啟動並執行情況下,因為沒有成功調用程式中的某些系統調用函數而產生的錯誤。往往這些系統調用函數通過傳回值(比如1,0,-1)來說明其是否調用成功,而程式員需要知道詳細的錯誤資訊,因此自建錯誤捕獲函數很有必要。

(1)errno和strerror()

errno它是一個整形的錯誤碼。當發生錯誤的時候,系統自動將錯誤碼賦給errno。使用下面的方法可以獲得具體的錯誤描述:

  1. void my_err(interror)
  2. {
  3.     printf("error: %s with errno: %d\n",strerror(error),error);
  4.     exit(1);
  5. }
  6. intmain()
  7. {
  8.         ..............
  9.         my_err(errno);
  10.         ..............
  11. }
 其中char *strerror(int errnum);是通過errnum來擷取錯誤描述,errnum即所傳遞的errno。該函數末尾的exit(1)使得程式發生錯誤時退出。但應該包含庫函數stdlib.h。

下面進行測試,測試程式(原始碼在本文末尾。)使用open()函數建立檔案,因為要建立的檔案已存在,而且使用了O_EXCL參數,因此open()會產生錯誤。結果如下:

  1. [email protected]:~/code$ ./error 
  2. error: File exists with errno: 17
 該方法可以詳細顯示錯誤資訊以及錯誤碼。但不能顯示錯誤出現的行數。

(2)perror()

其函數原型為:void perror(const char *s)。s一般是函數名。該函數會先將函數名列印出來,然後再列印出錯誤資訊。錯誤資訊與errno相對應。第二個參數__LINE__是一個宏,表示當前的行數。使用方法:

  1. void my_err2(const char* err_string,int line) 
  2.     fprintf(stderr,"error: line:%d ",line); 
  3.     perror(err_string); 
  4.         exit(1); 
  5. int main() 
  6.             ................. 
  7.         my_err2("open",__LINE__); 
  8.                 ................ 
  9. }
 測試結果如下:
  1. [email protected]:~/code$ ./error 
  2. error: line:29 open: File exists 
  3. }
 該方法可以顯示錯誤資訊以及錯誤出現的行數。

以上方法是在《linux C編程》中常用的方法,我適當的作了小調整。現在將這兩種方法結合起來:

  1. void my_err3(constchar*err_string,intline,interror)
  2. {
  3.     printf("error: line:%d %s():%s with errno:%d\n",line,err_string,strerror(error),error);
  4.         exit(1);
  5. }
  6. intmain()
  7. {
  8.             ................
  9.         my_err3("open",__LINE__,errno);
  10.             ................
  11. }
 測試結果如下:
  1. [email protected]:~/code$ ./error 
  2. error: line:30 open():File exists with errno:17
 這樣就可以顯示錯誤碼,錯誤描述,錯誤出現的行數以及出現錯誤的函數。對於和我一樣的新手來說,這裡特別要注意的是宏__LINE__前後的那個橫線是兩個連續的底線,而不是_LINE_,否則會出現錯誤。
原始碼如下:
說明:本程式只作測試用,為了同時顯示三種錯誤捕獲函數的資訊,因此屏蔽了每個函數的exit(1)。另外本文標頭檔函數用“”是因為顯示問題,沒有什麼特別意義。

 

 

linux c 系統報錯

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.