线程函数中检测错误信息
最近看Linux中的线程时发现, 出错检测不用perror
先说结论:线程中检查错误方式为:
int ret = pthread_mutex_init(&mutex, NULL);
if (ret != 0)
{
fprintf(stderr, "pthread_mutex_init: %s\n", strerror(ret));
exit(1);
}
而以前都是用如下方式:
int ret = bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr));;
if (ret != 0)
{
perror("bind error: ");
exit(1);
}
以前一直没注意过两者的区别
区别
perror
头文件:stdio.h
void perror(const char *msg);
它是基于errno的当前值,在标准错上产生一条出错信息,然后返回。
它先输出由msg字符串,然后是一个冒号后头接着对应于errno值的出错信息。
strerror
头文件:string.h
char * strerror(int errnum);
此函数将errnum(它通常就说errno值)映射为一个出错信息字符串,并返回错误此字符串
为何线程函数不用perror
两函数功能相同,但是运行原理不同,由于以往Linux下成功返回0,失败返回-1,挡出错时errno被系统自动设置为对应的错误号,perro根据错误号将其对应的错误信息字符串打印。
而线程函数成功返回0,失败直接返回错误号,因此不在用perror去捕捉系统的errno,而直接用strerror就能把返回的错误号转换为错误信息字符串。