可重入函数与不可重入函数

如果函数在不同逻辑下进行调用会对函数逻辑造成影响这种函数就称之为不可重入函数。

不管怎么调用都对函数内部功能程序逻辑不会造成影响,这种函数称之可重入函数。

一个函数是否可重入:

1.一个函数中是否对全局性数据经行修改操作

2.这个操作是否原子性

通过创建两个全局临时变量,因为两个变量之间具有原子性来演示可重入函数与不可重入函数的区别

void sigcb(int signo)
{
    static int a = 1;
    static int b = 1;
    int c = 0;

    a++;
    sleep(10);
    b++;
    c = a + b;
    printf("recv signo:%d--%d\n", signo, c);
    return;
}
int main()
{
    //sighandler_t signal(int signum, sighandler_t handler);
    //  signum: 信号的编号
    //  handler:   处理方式
    //      SIG_IGN 忽略
    //      SIG_DFL 默认
    int i = 0;
    signal(SIGINT, sigcb);
    signal(SIGQUIT, sigcb);
    while(1) {
        /*
        printf("-----------\n");
        kill(getpid(), SIGINT);
        if (++i == 3) {
            signal(SIGINT, SIG_DFL);
        }
        */
        sigcb(SIGQUIT);
    }
    return 0;
}

如果没有添加sleep(10)

我们理想的输出是4,6,8....

但是实际输出是5,6,8...

因为当我们添加sleep之前系统已开始调用,当我们按ctrl+c产生阻断信号,系统重新调用void函数,因为使a的值在sleep之后继续累加1.所以第一次c=5.

可以总结:

不可重入函数的一些重要特点(一般什么是不可重入函数)

    函数内部包含对全局性变量的修改操作

    函数传参的参数跟其他地方共用同一变量

     因为这些对全局性变量的操作不是原子性的,因此这些变量有可能在同时不同地方进行修改。

而可重入函数因为是局部变量修改以后并不会造成这些影响,或者是在阻断的部分已经具有原子性不会对函数造成期望值以外的影响。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值