说明
我的目的是在程序调用函数的时候,返回错误原因+那个文件内被调用+所在文件行号,如:端口已被使用[to_listen.c:21]
在调试程序的时候,函数返回结果为错误,但是一直不知道是什么原因报的错,我就想到了标准错误。以前没用过,所以自己尝试了一下,找到errno。每次用gdb调试,都是用“p errno”得到错误号,在去百度“linux错误处理与错误号_百度文库”找出对应的宏。接着man出错的那个函数,看他“errors”对应宏素表示的错误。我发现这样很麻烦,因为我需要的就是“表示的错误”的意思。所以我关注了一下“perror()”和“strerror()”函数。一个是直接输出给2号句柄,及标准错误,会在屏幕上立即显示(标准错误未重定向)。一个是返回错误信息的字符串指针,可以选择不输出,也可以更灵活的打印出来。
所需头文件
#include<errno.h>
#include<string.h>
PERROR()
对于我来说,缺点就是最多只能传一个参数(char*类型),当然也可以不传参。因为参数的限制,一行我只能打印文件名+错误原因。
例子
21 int tobind=bind(mysocket,(struct sockaddr*)&mysockaddr_in,sizeof(mysockaddr_in));
22 if(tobind!=0)
{
23 perror(__FILE__);
24 return 0;
25 }
结果:to_listen.cThe given address is already in use.
STRERROR()
更自由的打印错误,可以不显示不想要的信息,添加自己想要的信息。
例子
21 int tobind=bind(mysocket,(struct sockaddr*)&mysockaddr_in,sizeof(mysockaddr_in));
22 if(tobind!=0)
23 {
24 printf("ERRO:%s[%s:%d]\n",strerror(errno),__FILE__,__LINE__-3);
25 return 0;
26 }
结果:ERRO:The given address is already in use.[to_listen.c:22]
两个宏说明:
各位最好用MSDN等去看一下相关的所有的宏,因为我这里值用到了两个,所以我也只说着两个。
FILE(左右各两个下划线未显示)
当前函数所在文件名字符串
LINE(左右各两个下划线未显示)
此宏所在行数。网上看,因为bind函数在21行,而我宏在24行被使用,所以在printf里我执行了“-3”操作。
其他函数:
error();error_at_line(推荐使用);
如果果味大佬觉得还阔以的话,就点个收藏再点个赞才走吧。