linux中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;
}