zoukankan      html  css  js  c++  java
  • 标准库函数_4

    signal.h

    库变量

    变量 描述
    sig_atomic_t 是 int 类型,在信号处理程序中作为变量使用。它是一个对象的整数类型,该对象可以作为一个原子实体访问,即使存在异步信号时,该对象可以作为一个原子实体访问。

    库宏

    说明
    SIG_DFL 默认的信号处理程序。
    SIG_ERR 表示一个信号错误。
    SIG_IGN 忽视信号。

    SIG 宏用于表示以下各种条件的信号码:

    说明
    SIGABRT 程序异常终止。
    SIGFPE 算术运算出错,如除数为 0 或溢出。
    SIGILL 非法函数映象,如非法指令。
    SIGINT 中断信号,如 ctrl-C。
    SIGSEGV 非法访问存储器,如访问不存在的内存单元。
    SIGTERM 发送给本程序的终止请求信号。

    库函数

    函数 说明
    void (*signal(int sig, void (*func)(int)))(int) 该函数设置一个函数来处理信号,即信号处理程序。
    int raise(int sig) 该函数会促使生成信号 sig。sig 参数与 SIG 宏兼容。
    void sighandler(int);
    
    int main()
    {
    	signal(SIGINT, sighandler);
    	printf("generate a signal
    ");
    	raise(SIGINT);
    
    	printf("exit
    ");
    
    	return(0);
    }
    
    void sighandler(int)
    {
    	printf("get a signal
    ");
    }
    

    setjmp.h

    setjmplongjmp函数提供了一种类似沟通语句的机制,但它不局限于一个函数的作用域之内,这些函数常用于深层嵌套的函数调用链。如果在某低层的函数中检测到一个错误,可以立即返回到顶层函数,不必向调用链中每个中间层函数返回一个错误标志。

    声明一个jmp_buf变量,并调用setjmp函数对其初始化,setjmp函数返回0,setjmp会把程序的状态信息(例如,堆栈指针的当前位置和程序的计数器)保存到跳转缓冲区,调用setjmp时所处的函数就会成为顶层函数。以后,在顶层函数或其他任何他所调用的函数(直接调用或者间接调用)中调用longjmp函数,将导致这个被保存的状态重新恢复。longjmp的作用就使执行流通过再次从setjmp函数返回,从而立即跳回到顶层函数中。

    setjmp函数第一次被调用时,它返回0。当setjmp作为longjmp的执行结果再次返回时,他的返回值是longjmp的第二个参数,它必须是个非0值。通过检查他的返回值,程序可以判断是否调用了longjmp,如果存在多个longjmp也可以判断出哪个longjmp被调用。

    库变量

    变量 描述
    jmp_buf 一个用于存储宏 setjmp() 和函数 longjmp() 相关信息的数组类型。

    库宏

    说明
    int setjmp(jmp_buf environment) 这个宏把当前环境保存在变量 environment 中,以便函数 longjmp() 后续使用。如果这个宏直接从宏调用中返回,则它会返回零,但是如果它从 longjmp() 函数调用中返回,则它会返回一个非零值。

    库函数

    函数 说明
    void longjmp(jmp_buf environment, int value) 该函数恢复最近一次调用 setjmp() 宏时保存的环境,jmp_buf 参数的设置是由之前调用 setjmp() 生成的。
    #include <stdio.h>
    #include <setjmp.h>
     
    static jmp_buf buf;
     
    void second(void) {
        printf("second
    ");         // 打印
        longjmp(buf,1);             // 跳回setjmp的调用处 - 使得setjmp返回值为1
    }
     
    void first(void) {
        second();
        printf("first
    ");          // 不可能执行到此行
    }
     
    int main() {   
        if ( ! setjmp(buf) ) {
            first();                // 进入此行前,setjmp返回0
        } else {                    // 当longjmp跳转回,setjmp返回1,因此进入此行
            printf("main
    ");       // 打印
        }
     
        return 0;
    }
    
  • 相关阅读:
    洛谷 P1226 【模板】快速幂||取余运算 题解
    洛谷 P2678 跳石头 题解
    洛谷 P2615 神奇的幻方 题解
    洛谷 P1083 借教室 题解
    洛谷 P1076 寻宝 题解
    洛谷 UVA10298 Power Strings 题解
    洛谷 P3375 【模板】KMP字符串匹配 题解
    Kafka Shell基本命令
    Mybatis与Hibernate的详细对比
    MyBatis简介
  • 原文地址:https://www.cnblogs.com/chay/p/11521408.html
Copyright © 2011-2022 走看看