【C语言】【unix c】可重入函数

三、可重入函数

    信号处理函数的栈桢是私有的(每个函数在栈中都有一个私有的栈针)

    信号处理函数和进程的执行是异步的(无需使进程停止等待接收函数的信号)

    如果这两条执行路线出现共享资源的竞争,会导致出现问题,所以应该尽量避免竞争(尽量使函数不去访问栈桢以外的资源)

    可重入函数主要用于多任务环境中,该函数在执行过程中可以随时被中断,返回来继续执行的时候不会发生错误。他除了使用自身的栈上的变量外,不依赖任何环境(如果要使用全局变量等等还需要做一些措施)

    如果函数中使用了全局变量,静态的局部变量,malloc的内存。那么这个函数就是不可重入函数。
    可重入函数只能访问栈桢里的内容,如果这个函数只有自动局部变量,那么这个函数就是可重入函数。

    举例说明信号处理函数和进程竞争共享资源(count.c)
        #include <stdio.h>
        #include <signal.h>

        int count = 1;
        void doit(int n) {
            int val;
            val = count;
            val++;
            usleep(5000);
            printf("val=%d\n", val);
            count = val;
            return;
        }
        int main(void) {
            signal(2,doit);
            while(1)
            doit(3);
            return 0;
        }
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页