信号之函数的可重入性
在调用某个函数过程中出现中断信号,且改信号处理函数中再次调用该函数,访问全局、静态变量的函数是不可重入函数。
前后数据不一致,函数是不可重入的,特点:函数中使用全局变量或静态变量。
前后数据一致,函数是可重入的,特征:函数中使用局部变量。

root@spark# cat reinside.c
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>int g_v[10];
int *h_v;void set(int n)
{printf("begin running set.....\n");int p_v[10];for (int i = 0; i < 10; i++) {p_v[i] = n;h_v[i] = n;g_v[i] = n;sleep(1);}printf("p_v:");for (int i = 0; i < 10; i++) {printf("%d ", p_v[i]);}printf("\n");printf("g_v:");for (int i = 0; i < 10; i++) {printf("%d ", g_v[i]);}printf("\n");printf("h_v:");for (int i = 0; i < 10; i++) {printf("%d ", h_v[i]);}printf("\n");printf("end running set....\n");return;
}void sig_hander(int signo)
{printf("%d receive sigal SIGTSTP...\n", getpid());if (signal(SIGTSTP, sig_hander) == SIG_ERR) {perror("sig_hander signal fail");}set(20);return;
}int main(void)
{if (signal(SIGTSTP, sig_hander) == SIG_ERR) {perror("signal fail");}h_v = (int *)malloc(sizeof(int)*10);if (h_v == NULL) {perror("malloc h_v fail");}printf("begin running main....\n");set(10);printf("end running main....\n");return 0;
}

root@spark# ./reinside
begin running main…
begin running set…
^Z19559 receive sigal SIGTSTP…
begin running set…
p_v:20 20 20 20 20 20 20 20 20 20
g_v:20 20 20 20 20 20 20 20 20 20
h_v:20 20 20 20 20 20 20 20 20 20
end running set…
p_v:10 10 10 10 10 10 10 10 10 10
g_v:20 20 20 20 20 10 10 10 10 10
h_v:20 20 20 20 20 10 10 10 10 10
end running set…
end running main…
root@spark#
运行5秒的时候按下ctrl+z, main函数中调用set函数中的全局变量内容被改写。

信号之函数的可重入性相关推荐

  1. Linux信号编程实践(二) 信号发送函数和可重入函数

    在早期的UNIX中信号是不可靠的,不可靠在这里指的是:信号可能丢失,一个信号发生了,但进程却可能一直不知道这一点. 现在Linux 在SIGRTMIN实时信号之前的都叫不可靠信号,这里的不可靠主要是不 ...

  2. 函数可重入性及编写规范

    一.可重入函数 1)什么是可重入性? 可重入(reentrant)函数可以由多于一个任务并发使用,而不必担心数据错误.相反, 不可重入(non-reentrant)函数不能由超过一个任务所共享,除非能 ...

  3. 可重入函数与不可重入函数(转)

    转自:http://www.cppblog.com/franksunny/archive/2007/08/03/29269.html 主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数 ...

  4. 【Linux系统编程】可重入函数和不可重入函数

    在实时系统的设计中,经常会出现多个任务调用同一个函数的情况.如果有一个函数不幸被设计成为这样:那么不同任务调用这个函数时可能修改其他任务调用这个函数的数据,从而导致不可预料的后果.这样的函数是不安全的 ...

  5. 可重入函数与不可重入函数

    主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误:而不可重入的函数由于使 ...

  6. 函数的可重入和不可重入

    https://www.ibm.com/developerworks/cn/linux/l-reent.html这是一篇描述重入函数和不可重入函数的文章.先把他copy过来: 在早期的编程中,不可重入 ...

  7. 浅谈可重入函数与不可重入函数

    在实时系统的设计中,经常会出现多个任务调用同一个函数的情况.如果有一个函数不幸被设计成为这样:那么不同任务调用这个函数时可能修改其他任务调用这个函数的数据,从而导致不可预料的后果.这样的函数是不安全的 ...

  8. 详解可重入函数与不可重入函数

    C/C++ 中的可重入函数与不可重入函数 引言 在编程语言发展的历程中,"函数"的概念无疑是最历史中最伟大的发明之一.简单来说,函数是完成指定功能的代码集合. 函数的基本样式: i ...

  9. 总结可重入函数与不可重入函数常见的几个问题

    文章目录 什么是可重入函数与不可重入函数? 如何保证函数的可重入性? 如何将一个不可重入改写成可重入? 什么是可重入函数与不可重入函数? 可重入函数主要用于多任务环境中,一个可重入的函数简单来说就是可 ...

最新文章

  1. CCNA基础知识汇总
  2. ExecutorService为创建的线程池ExecutorService pool = Executors.newFixedThreadPool(POOL_SIZE)
  3. 添加当前文件夹及其子文件夹到以及别而的文件夹到当前路径
  4. 停车场计费算法 php,停车场收费算法,思路卡住了求补完!该如何处理
  5. 本地图片转base64_从一道面试题说起:GET 请求能传图片吗?
  6. 3.数据库操作相关术语,Oracle认证,insert into,批量插入,update tablename set,delete和truncate的区别,sql文件导入
  7. 用画小狗的方法来解释Java中的值传递
  8. S5PV210裸机之外部中断
  9. 深入浅出话VC++(2)——MFC的本质
  10. oracle什么是定长,数据库中定长类型(char)和变长类型(varchar2)有什么区别?
  11. Qt 学习之路 2(2):Qt 简介 笔记
  12. 不考虑知识点,考代码段更好
  13. cad计算机画图标准,CAD高级绘图员鉴定标准
  14. 200个案例5大应用场景最全AI“战疫”武器
  15. easypoi 语法_高考阅读amp;语法填空amp;完型amp;词汇amp;句型amp;翻译amp;语法 系列大合集 找资料不愁了...
  16. Cisco路由器的硬件结构、重要存储设备Flash和NVRAM
  17. Funcode-Q版泡泡堂
  18. CORBA的基本内容(上)
  19. 【OpenGL】画线算法
  20. 信息学奥赛一本通(题解目录)

热门文章

  1. option标签selected=selected属性失效的问题
  2. ubuntu下C编程,编译基础( 转)
  3. 2018-2019-1 20165203 《信息安全系统设计基础》第六周学习总结
  4. Linux系统之TroubleShooting(启动故障排除)
  5. php数据库备份脚本
  6. 不使用物理引擎,自己动手做真实物理的模拟投篮游戏
  7. C#中实现js中的eval函数功能
  8. asp.net(c#) 将dbf转换为xls或wps,并将数据的列名改成中文;并判断本机是否安装office2003,2007和wps2007,2010...
  9. 质性研究工具_质性研究【001】
  10. 计算机技术与分析化学论文,分析化学(论文).doc