詳解C語言中的錯誤報告errno與其相關(guān)應(yīng)用方法
C語言標(biāo)準(zhǔn)庫中的錯誤報告用法有三種形式。
1、errno
errno在<errno.h>頭文件中定義,如下
#ifndef errno extern int errno; #endif
外部變量errno保存庫程序中實現(xiàn)定義的錯誤碼,通常被定義為errno.h中以E開頭的宏,
所有錯誤碼都是正整數(shù),如下例子
# define EDOM 33 /* Math argument out of domain of function. */
EDOM的意思是參數(shù)不在數(shù)學(xué)函數(shù)能接受的域中,稍后的例子中用到了這個宏。
errno的常見用法是在調(diào)用庫函數(shù)之前先清零,隨后再進行檢查。
在linux中使用c語言編程時,errno是個很有用的動動。他可以把最后一次調(diào)用c的方法的錯誤代碼保留。但是如果最后一次成功的調(diào)用c的方法,errno不會改變。因此,只有在c語言函數(shù)返回值異常時,再檢測errno。
errno會返回一個數(shù)字,每個數(shù)字代表一個錯誤類型。詳細的可以查看頭文件。/usr/include/asm/errno.h
如何把errno的數(shù)字轉(zhuǎn)換成相應(yīng)的文字說明?
一個簡單的例子
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <math.h>
int main(void)
{
errno = 0;
int s = sqrt(-1);
if (errno) {
printf("errno = %d\n", errno); // errno = 33
perror("sqrt failed"); // sqrt failed: Numerical argument out of domain
printf("error: %s\n", strerror(errno)); // error: Numerical argument out of domain
}
return 0;
2、strerror
strerror在<string.h>中定義,如下
__BEGIN_NAMESPACE_STD
/* Return a string describing the meaning of the `errno' code in ERRNUM. */
extern char *strerror (int __errnum) __THROW;
__END_NAMESPACE_STD
函數(shù)strerror返回一個錯誤消息字符串的指針,其內(nèi)容是由實現(xiàn)定義的,字符串不能修改,但可以在后續(xù)調(diào)用strerror函數(shù)是覆蓋。
char *strerror(int errno)
使用方式如下:
fprintf(stderr,"error in CreateProcess %s, Process ID %d ",strerror(errno),processID)
將錯誤代碼轉(zhuǎn)換為字符串錯誤信息,可以將該字符串和其它的信息組合輸出到用戶界面。
注:假設(shè)processID是一個已經(jīng)獲取了的整形ID
3、perror
perror在<stdio.h>中定義,如下
__BEGIN_NAMESPACE_STD
/* Print a message describing the meaning of the value of errno.
This function is a possible cancellation point and therefore not
marked with __THROW. */
extern void perror (const char *__s);
__END_NAMESPACE_STD
函數(shù)perror在標(biāo)準(zhǔn)錯誤輸出流中打印下面的序列:參數(shù)字符串s、冒號、空格、包含errno中當(dāng)前錯誤碼的錯誤短消息和換行符。在標(biāo)準(zhǔn)C語言中,如果s是NULL指針或NULL字符的指針,則只打印錯誤短消息,而不打印前面的參數(shù)字符串s、冒號及空格。
void perror(const char *s)
函數(shù)說明
perror ( )用來將上一個函數(shù)發(fā)生錯誤的原因輸出到標(biāo)準(zhǔn)錯誤(stderr),參數(shù)s 所指的字符串會先打印出,后面再加上錯誤原因 字符串。此錯誤原因依照全局變量 errno 的值來決定要輸出的字符串。
另外并不是所有的c函數(shù)調(diào)用發(fā)生的錯誤信息都會修改errno。例如gethostbyname函數(shù)。
errno是否是線程安全的?
errno是支持線程安全的,而且,一般而言,編譯器會自動保證errno的安全性。
我們看下相關(guān)頭文件 /usr/include/bits/errno.h
會看到如下內(nèi)容:
# if !defined _LIBC || defined _LIBC_REENTRANT /* When using threads, errno is a per-thread value. */ # define errno (*__errno_location ()) # endif # endif /* !__ASSEMBLER__ */ #endif /* _ERRNO_H */
也就是說,在沒有定義__LIBC或者定義_LIBC_REENTRANT的時候,errno是多線程/進程安全的。
為了檢測一下你編譯器是否定義上述變量,不妨使用下面一個簡單程序。
#include <stdio.h>
#include <errno.h>
int main( void )
{
#ifndef __ASSEMBLER__
printf( "Undefine __ASSEMBLER__/n" );
#else
printf( "define __ASSEMBLER__/n" );
#endif
#ifndef __LIBC
printf( "Undefine __LIBC/n" );
#else
printf( "define __LIBC/n" );
#endif
#ifndef _LIBC_REENTRANT
printf( "Undefine _LIBC_REENTRANT/n" );
#else
printf( "define _LIBC_REENTRANT/n" );
#endif
return 0;
}
欄 目:C語言
下一篇:詳解C語言中的char數(shù)據(jù)類型及其與int類型的轉(zhuǎn)換
本文標(biāo)題:詳解C語言中的錯誤報告errno與其相關(guān)應(yīng)用方法
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/2872.html
您可能感興趣的文章
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用函數(shù)刪除字符
- 04-02c語言的正則匹配函數(shù) c語言正則表達式函數(shù)庫
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對數(shù)怎么表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段函數(shù)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排序法函數(shù)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段函數(shù)
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求階乘


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10C#中split用法實例總結(jié)
- 01-10delphi制作wav文件的方法
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 04-02jquery與jsp,用jquery
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文


