错误处理相关函数

系统调用返回值判断

系统调用不能保证每次都成功,必须进行出错处理,这样一方面可以保证程序逻辑正常,另一方面可以迅速得到故障信息。

错误处理

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.

 

posted @ 2015-11-28 20:39  yuxi_o  阅读(345)  评论(0编辑  收藏  举报