错误处理相关函数
系统调用返回值判断
系统调用不能保证每次都成功,必须进行出错处理,这样一方面可以保证程序逻辑正常,另一方面可以迅速得到故障信息。
错误处理
errno由libc定义的全局变量,每个错误原因对应一个错误码,errno在头文件errno.h中声明,是一个整型变量,都是正整数(系统错误号都是正整数)。
Its value is significant only when the return value of the call indicated an error (i.e., -1 from most system calls; -1 or
NULL from most library functions); a function that succeeds is allowed to change errno.
函数返回值与errno是两个不同概念,通过函数返回值判断函数是否成功执行,其可为任意值(正数或负数均可,最好不要为0,系统默认函数成功返回0)。
驱动中一般返回负的错误号(如errnum),此时errno=-errnum,从而perror()可以直接打印错误信息,此时strerror(-errnum)可正确打印错误信息。
当函数执行错误时错误号才有意义,指定错误的原因。
若函数返回值就是指定错误号的除外,此时就不能用perror(),要用strerror(errnum)。
errno不会为0,系统调用或库函数绝不会使errno=0,自定义函数最好也不要这么做。
errno is thread-local; setting it in one thread does not affect its value in any other thread.
errno是线程全局变量,一个线程的值不会影响其他线程中errno。
可参考:man errno; man errno.h
errno -l // 显示错误号列表
perror
NAME perror - print a system error message SYNOPSIS #include <stdio.h> void perror(const char *s); #include <errno.h> const char *sys_errlist[]; int sys_nerr; int errno; The routine perror() produces a message on the standard error output,describing the last error encountered during a call to a system or library function.
strerror
NAME strerror, strerror_r - return string describing error number SYNOPSIS #include <string.h> char *strerror(int errnum); DESCRIPTION The strerror() function returns a pointer to a string that describes the error code passed in the argument errnum, possibly using the LC_MESSAGES part of the current locale to select the appropriate language. This string must not be modified by the application, but may be modified by a subsequent call to perror(3) or strerror(). No library function will modify this string. RETURN VALUE The strerror() and the GNU-specific strerror_r() functions return the appropriate error description string, or an "Unknown error nnn" message if the error number is unknown.
函数返回静态内存的指针。有些函数的错误码并不保存在errno中,而是通过返回值返回,此时就不能调用perror(),需要调用strerror().
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> int main(int argc, char **argv) { if(argc < 2){ printf("usage: %s no\n", argv[0]); exit(1); } char *errstr = NULL; errstr = strerror((int)*argv[1]); if(errstr == NULL){ printf("strerror return NULL\n"); } else { printf("%s\n", errstr); } perror("result"); return 0; }
fprintf
int fprintf(FILE *stream, const char *format, ...); fprintf(stderr, "Usage: %s outfile\n", argv[0]);
exit
NAME exit - cause normal process termination SYNOPSIS #include <stdlib.h> void exit(int status); The exit() function causes normal process termination and the value of status & 0377 is returned to the parent (see wait(2)). All open stdio(3) streams are flushed and closed. Files created by tmpfile(3) are removed. The C standard specifies two constants, EXIT_SUCCESS and EXIT_FAILURE, that may be passed to exit() to indicate successful or unsuccessful termination, respectively. RETURN VALUE The exit() function does not return.
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步