C语言-错误处理与信号处理

<errno.h>:错误

  • 标准库中的一些函数通过向<erron.h>中声明的int型errno变量存储一个错误码(正整数)来表示有错误发生。
  • 如果使用的一个库函数,通过给errno赋值来产生程序运行出错的信号,我们可以在调用这个函数之后,==检查erron的值是否为0==,来判断函数调用过程中是否有错误发生。
  • 使用errno来检测函数调用的错误,需要==在函数调用前将errno置零==。
  • errno中存储的错误值经常是以下两个宏:
    • EDOM(定义域错误):传递给函数的一个参数==超出了定义域==,使用这个宏。
    • ERANGE(取值范围错误):函数的==返回值太大,无法用返回类型==。
  • 与变量errno有关的两个函数(都不属于<errno.h>):
    • perror函数:
      • <stdio.h>中声明,用于显示描述错误的信息;perror函数会==输出到stderr流==。
      • 原型:void perror(const char *s)
      • 参数:
        • 一个作为部分错误消息的字符串。
      • 返回值:
        • 依次显示下列内容:
          1. 调用perror的参数;
          2. 一个分号;
          3. 一个空格;
          4. 一条出错消息:消息的内容根据errno的值决定;
          5. 一个换行符。
        • 示例:perror("sqrt error"); sqrt error: Numercial argument out of domain
    • strerror函数:
      • <string.h>声明,当以错误码为参数调用strerror时,函数会==返回一个指针,它指向一个描述这个错误的字符串==;
      • 原型:char *strerror(int errnum)
      • 参数:
        • strerror函数的参数==通常是errno的值==,但以任意整数为参数都能返回一个字符串。
      • 示例:puts(strerror(EDOM))
    • 对于同一个错误,perror函数和strerror函数返回的消息的值是相同的。
  • 示例:
errno = 0;

y = sqrt(x);
if(errno != 0) {
    perror("sqrt error");
    puts(strerror(erron));
}

<signal.h>:信号处理

  • <signal.h>提供了==处理异常情况(异常情况又称为信号)的工具==。
  • 信号:当有错误或者外部事件发生时,称为产生了一个信号。很多信号可以在程序执行过程中的任意时刻发生。
  • 信号类型
    • ==运行时错误==,如(除以0);
    • ==发生在程序以外的事件==,如:操作系统对正在运行的程序的中断信号。
  • 信号宏
    • 信号宏:<signal.h>中定义了一系列的宏,==用于表示不同的信号==;
    • 6种信号宏:
      1. SIGABRT:异常终止;
      2. SIGFPE:在算术运算中发生错误;
      3. SIGILL:无效指令;
      4. SIGINT:中断;
      5. SIGSEGV:无效存储访问;
      6. SIGTERM:终止请求。
  • signal函数:
    • signal是<signal.h>提供的,用来==安装信号处理函数,以便将来给定的信号发生时使用==。
    • 原型:void (*signal(int sig, void (*func)(int)))(int)
    • 参数:
      • 第一个参数是==特定信号的编码(表示不同信号的宏)==;
      • 第二个参数是==一个指向会在信号发生时处理这一信号的函数的指针==;
    • 返回值:
      • 一旦调用信号处理函数返回,==程序会从信号发生点恢复并继续执行==,除了SIGABRT和SIGFPE两种信号。
      • signal的返回值是一个==指向指定信号的前一个处理函数的指针==。可以用于恢复原来的处理函数。
      • 如果一个signal函数调用失败,==会返回SIG_ERR(一个在<signal.h>中定义的宏)并在errno中存入一个正值。==
  • 信号处理函数:
    • 自定义信号处理函数:
      • 每个信号处理函数都必须有一个==int类型的参数==,且返回类型为void。
      • 当一个特定的信号产生并调用相应的信号处理函数时,==信号的编码会作为参数传递给处理函数==。
    • 预定义的信号处理函数:<signal.h>提供了一些预定义的信号处理函数,这些函数==都是用宏表示的==。
      • SIG_DFL:
        • 按==默认==方式处理信号。
        • 调用该函数的结果是由实现定义的,但大多数情况下会导致程序终止。
      • SIG_IGN:
        • 当指定的信号产生时,==忽略该信号==;
  • raise函数:
    • <signal.h>中声明,用来==使程序主动触发信号==。
    • 原型:int raise(int sig)
    • 参数:
      • sig参数用于==指定所需信号的编码==;
    • 返回值:
      • raise函数的返回值,代表产生信号是否成功:==成功为0,失败为非0==。