1. 程式人生 > >linux中c語言errno的使用

linux中c語言errno的使用

在linux中使用c語言程式設計時,errno是個很有用的動動。他可以把最後一次呼叫c的方法的錯誤程式碼保留。但是如果最後一次成功的呼叫c的方法,errno不會改變。因此,只有在c語言函式返回值異常時,再檢測errno。

   errno會返回一個數字,每個數字代表一個錯誤型別。詳細的可以檢視標頭檔案。/usr/include/asm/errno.h

   如何把errno的數字轉換成相應的文字說明?

   方式一:可以使用strerrno函式

char *strerror(int errno)

   使用方式如下:

fprintf(stderr,"error in CreateProcess %s, Process ID %d ",strerror(errno),processID)

   將錯誤程式碼轉換為字串錯誤資訊,可以將該字串和其它的資訊組合輸出到使用者介面。

   注:假設processID是一個已經獲取了的整形ID

   方式二:使用perror函式

void perror(const char *s)

   函式說明

   perror ( )用來將上一個函式發生錯誤的原因輸出到標準錯誤(stderr),引數s 所指的字串會先打印出,後面再加上錯誤原因 字串。此錯誤原因依照全域性變數 errno 的值來決定要輸出的字串。

   另外並不是所有的c函式呼叫發生的錯誤資訊都會修改errno。例如gethostbyname函式。

   errno是否是執行緒安全的?

   errno是支援執行緒安全的,而且,一般而言,編譯器會自動保證errno的安全性。

   我們看下相關標頭檔案 /usr/include/bits/errno.h

   會看到如下內容:

   #  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;
}