errno本身是一个整型的全局变量,当使用errno的库函数,在执行出错时,只通过函数返回值返回一个表示出错的标识,如-1或NULL等,具体的出错原因会被赋值到errno中。通过查询errno可以确定具体的出错原因。
在errno.h中定义了一系列常见的宏,其形式为
#define EPERM 1 /* Operation not permitted */
可以划分为
1 定义一个宏名,以E开头;
2 定义其值,为一个正整数;
3 一个注释区域,说明该错误号出现时的具体错误内容。
errno.h中的条目因不同编译器的实现而有所区别,一般在100~128条范围内,具体内容可以在编译器的系统标准头文件夹下查看对应文件。
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
}
字符处理函数 \x0d\x0a本类别函数用于对单个字符进行处理,包括字符的类别测试和字符的大小写转换 \x0d\x0a\x0d\x0a头文件 ctype.h \x0d\x0a\x0d\x0a函数列表 \x0d\x0a函数类别 函数用途 详细说明 \x0d\x0a字符测试 是否字母和数字 isalnum \x0d\x0a是否字母 isalpha \x0d\x0a是否控制字符 iscntrl \x0d\x0a是否数字 isdigit \x0d\x0a是否可显示字符(除空格外) isgraph \x0d\x0a是否可显示字符(包括空格) isprint \x0d\x0a是否既不是空格,又不是字母和数字的可显示字符 ispunct \x0d\x0a是否空格 isspace \x0d\x0a是否大写字母 isupper \x0d\x0a是否16进制数字(0-9,A-F)字符 isxdigit \x0d\x0a字符大小写转换函数 转换为大写字母 toupper \x0d\x0a转换为小写字母 tolower \x0d\x0a\x0d\x0a地区化 \x0d\x0a本类别的函数用于处理不同国家的语言差异。 \x0d\x0a\x0d\x0a头文件 local.h \x0d\x0a\x0d\x0a函数列表 \x0d\x0a函数类别 函数用途 详细说明 \x0d\x0a地区控制 地区设置 setlocale \x0d\x0a数字格式约定查询 国家的货币、日期、时间等的格式转换 localeconv \x0d\x0a\x0d\x0a数学函数 \x0d\x0a本分类给出了各种数学计算函数,必须提醒的是ANSI C标准中的数据格式并不符合IEEE754标准,一些C语言编译器却遵循IEEE754(例如frinklin C51) \x0d\x0a\x0d\x0a头文件 math.h \x0d\x0a\x0d\x0a函数列表 \x0d\x0a函数类别 函数用途 详细说明 \x0d\x0a错误条件处理 定义域错误(函数的输入参数值不在规定的范围内) \x0d\x0a值域错误(函数的返回值不在规定的范围内) \x0d\x0a三角函数 反余弦 acos \x0d\x0a反正弦 asin \x0d\x0a反正切 atan \x0d\x0a反正切2 atan2 \x0d\x0a余弦 cos \x0d\x0a正弦 sin \x0d\x0a正切 tan \x0d\x0a双曲函数 双曲余弦 cosh \x0d\x0a双曲正弦 sinh \x0d\x0a双曲正切 tanh \x0d\x0a指数和对数 指数函数 exp \x0d\x0a指数分解函数 frexp \x0d\x0a乘积指数函数 fdexp \x0d\x0a自然对数 log \x0d\x0a以10为底的对数 log10 \x0d\x0a浮点数分解函数 modf \x0d\x0a幂函数 幂函数 pow \x0d\x0a平方根函数 sqrt \x0d\x0a整数截断,绝对值和求余数函数 求下限接近整数 ceil \x0d\x0a绝对值 fabs \x0d\x0a求上限接近整数 floor \x0d\x0a求余数 fmod \x0d\x0a\x0d\x0a本分类函数用于实现在不同底函数之间直接跳转代码。 头文件 setjmp.h io.h \x0d\x0a\x0d\x0a函数列表 \x0d\x0a函数类别 函数用途 详细说明 \x0d\x0a保存调用环境 setjmp \x0d\x0a恢复调用环境 longjmp \x0d\x0a\x0d\x0a信号处理 \x0d\x0a该分类函数用于处理那些在程序执行过程中发生例外的情况。 \x0d\x0a\x0d\x0a头文件 signal.h \x0d\x0a\x0d\x0a函数列表 \x0d\x0a函数类别 函数用途 详细说明 \x0d\x0a指定信号处理函数 signal \x0d\x0a发送信号 raise \x0d\x0a\x0d\x0a可变参数处理 \x0d\x0a本类函数用于实现诸如printf,scanf等参数数量可变底函数。 \x0d\x0a\x0d\x0a头文件 stdarg.h \x0d\x0a\x0d\x0a函数列表 \x0d\x0a函数类别 函数用途 详细说明 \x0d\x0a可变参数访问宏 可变参数开始宏 va_start \x0d\x0a可变参数结束宏 va_end \x0d\x0a可变参数访问宏 访问下一个可变参数宏 va_arg \x0d\x0a\x0d\x0a输入输出函数 \x0d\x0a该分类用于处理包括文件、控制台等各种输入输出设备,各种函数以“流”的方式实现 \x0d\x0a\x0d\x0a头文件 stdio.h \x0d\x0a\x0d\x0a函数列表 \x0d\x0a函数类别 函数用途 详细说明 \x0d\x0a文件 *** 作 \x0d\x0a删除文件 remove \x0d\x0a修改文件名称 rename \x0d\x0a生成临时文件名称 tmpfile \x0d\x0a得到临时文件路径 tmpnam \x0d\x0a文件访问 关闭文件 fclose \x0d\x0a刷新缓冲区 fflush \x0d\x0a打开文件 fopen \x0d\x0a将已存在的流指针和新文件连接 freopen \x0d\x0a设置磁盘缓冲区 setbuf \x0d\x0a设置磁盘缓冲区 setvbuf \x0d\x0a格式化输入与输出函数 格式输出 fprintf \x0d\x0a格式输入 fscanf \x0d\x0a格式输出(控制台) printf \x0d\x0a格式输入(控制台) scanf \x0d\x0a格式输出到缓冲区 sprintf \x0d\x0a从缓冲区中按格式输入 sscanf \x0d\x0a格式化输出 vfprintf \x0d\x0a格式化输出 vprintf \x0d\x0a格式化输出 vsprintf \x0d\x0a字符输入输出函数 输入一个字符 fgetc \x0d\x0a字符串输入 fgets \x0d\x0a字符输出 fputc \x0d\x0a字符串输出 fputs \x0d\x0a字符输入(控制台) getc \x0d\x0a字符输入(控制台) getchar \x0d\x0a字符串输入(控制台) gets \x0d\x0a字符输出(控制台) putc \x0d\x0a字符输出(控制台) putchar \x0d\x0a字符串输出(控制台) puts \x0d\x0a字符输出到流的头部 ungetc \x0d\x0a直接输入输出 直接流读 *** 作 fread \x0d\x0a直接流写 *** 作 fwrite \x0d\x0a文件定位函数 得到文件位置 fgetpos \x0d\x0a文件位置移动 fseek \x0d\x0a文件位置设置 fsetpos \x0d\x0a得到文件位置 ftell \x0d\x0a文件位置复零位 remind \x0d\x0a错误处理函数 错误清除 clearerr \x0d\x0a文件结尾判断 feof \x0d\x0a文件错误检测 ferror \x0d\x0a得到错误提示字符串 perror \x0d\x0a\x0d\x0a实用工具函数 \x0d\x0a本分类给出了一些函数无法按以上分类,但又是编程所必须要的。 \x0d\x0a\x0d\x0a头文件 stdlib.h \x0d\x0a\x0d\x0a函数列表 \x0d\x0a函数类别 函数用途 详细说明 \x0d\x0a字符串转换函数 字符串转换为整数 atoi \x0d\x0a字符串转换为长整数 atol \x0d\x0a字符串转换为浮点数 strtod \x0d\x0a字符串转换为长整数 strtol \x0d\x0a字符串转换为无符号长整型 strtoul \x0d\x0a伪随机序列产生函数 产生随机数 rand \x0d\x0a设置随机函数的起动数值 srand \x0d\x0a存储管理函数 分配存储器 calloc \x0d\x0a释放存储器 free \x0d\x0a存储器分配 malloc \x0d\x0a重新分配存储器 realloc \x0d\x0a环境通信 中止程序 abort \x0d\x0a退出程序执行,并清除环境变量 atexit \x0d\x0a退出程序执行 exit \x0d\x0a读取环境参数 getenv \x0d\x0a程序挂起,临时执行一个其他程序 system \x0d\x0a搜索和排序工具 二分查找(数据必须已排序) bsearch \x0d\x0a快速排序 qsort \x0d\x0a整数运算函数 求绝对值 abs \x0d\x0adiv \x0d\x0a得到除法运算底商和余数 \x0d\x0a求长整形底绝对值 labs \x0d\x0a求长整形除法的商和余数 ldiv \x0d\x0a多字节字符函数 得到多字节字符的字节数 mblen \x0d\x0a得到多字节字符的字节数 mbtowc \x0d\x0a多字节字符转换 wctomb \x0d\x0a多字节字符的字符串 *** 作 将多字节串转换为整数数组 mbstowcs \x0d\x0a将多字节串转换为字符数组 mcstowbs \x0d\x0a\x0d\x0a字符串处理 \x0d\x0a本分类的函数用于对字符串进行合并、比较等 *** 作 \x0d\x0a\x0d\x0a头文件 string.h \x0d\x0a\x0d\x0a函数列表 \x0d\x0a函数类别 函数用途 详细说明 \x0d\x0a字符串拷贝 块拷贝(目的和源存储区不可重叠) memcpy \x0d\x0a块拷贝(目的和源存储区可重叠) memmove \x0d\x0a串拷贝 strcpy \x0d\x0a按长度的串拷贝 strncpy \x0d\x0a字符串连接函数 串连接 strcat \x0d\x0a按长度连接字符串 strncat \x0d\x0a串比较函数 块比较 memcmp \x0d\x0a字符串比较 strcmp \x0d\x0a字符串比较(用于非英文字符) strcoll \x0d\x0a按长度对字符串比较 strncmp \x0d\x0a字符串转换 strxfrm \x0d\x0a字符与字符串查找 字符查找 memchr \x0d\x0a字符查找 strchr \x0d\x0a字符串查找 strcspn \x0d\x0a字符串查找 strpbrk \x0d\x0a字符串查找 strspn \x0d\x0a字符串查找 strstr \x0d\x0a字符串分解 strtok \x0d\x0a杂类函数 字符串设置 memset \x0d\x0a错误字符串映射 strerror \x0d\x0a求字符串长度 strlen \x0d\x0a\x0d\x0a日期和时间函数 \x0d\x0a本类别给出时间和日期处理函数 \x0d\x0a\x0d\x0a头文件 time.h \x0d\x0a\x0d\x0a函数列表 \x0d\x0a函数类别 函数用途 详细说明 \x0d\x0a时间 *** 作函数 得到处理器时间 clock \x0d\x0a得到时间差 difftime \x0d\x0a设置时间 mktime \x0d\x0a得到时间 time \x0d\x0a时间转换函数 得到以ASCII码表示的时间 asctime \x0d\x0a得到字符串表示的时间 ctime \x0d\x0a得到指定格式的时间 strftime \x0d\x0a\x0d\x0a函数库未来的发展方向 \x0d\x0a本部分用于说明各类别函数库在将来如何发展。 \x0d\x0a\x0d\x0a序号 库类别 头文件 详细说明 \x0d\x0a1 错误处理 errno.h \x0d\x0a2 字符处理 ctype.h \x0d\x0a3 地区化 local.h \x0d\x0a4 数学函数 math.h \x0d\x0a5 信号处理 signal.h \x0d\x0a6 输入输出 stdio.h \x0d\x0a7 实用工具程序 stdlib.h \x0d\x0a8 字符串处理 string.h欢迎分享,转载请注明来源:内存溢出
评论列表(0条)