全局变量异步 I/O

分析如下父子进程交替 数数 程序。当捕捉函数里面的 sleep 取消,程序即会出现问题。请分析原因。

#include<stdio.h>
#include<signal.h>
#include<unistd.h>
#include<stdlib.h>intn=0,flag=0; void  sys_err(char*   str)
{ perror(str); exit(1);
}
void    do_sig_child    (int    num)
{printf("I am  child %d\t%d\n",getpid(),n);n+=2;flag=1; sleep(1);
}
void    do_sig_parent   (int    num)
{printf("I am  parent%d\t%d\n",getpid(),n);n+=2;flag=1;sleep(1);
}
int main(void) {pid_tpid;
struct  sigaction   act;
if((pid=fork())<0)sys_err("fork");else    if(pid>0){n=1;sleep(1);act.sa_handler   =  do_sig_parent; sigemptyset(&act.sa_mask); act.sa_flags=0;sigaction(SIGUSR2,&act,NULL); //注册自己的信号捕捉函数 父使用 SIGUSR2 信号 do_sig_parent(0); while(1){ /*waitforsignal*/;if(flag==1){ //父进程数数完成 kill(pid,SIGUSR1);flag=0; //标志已经给子进程发送完信号 } } }else    if(pid==0){ n=2;act.sa_handler   =  do_sig_child; sigemptyset(&act.sa_mask); act.sa_flags=0; sigaction(SIGUSR1,&act,NULL);while(1){ /*waitingforasignal*/;if   (flag==1) {kill(getppid(),SIGUSR2); flag=0; } }}return0;
}

示例中,通过 flag 变量标记程序实行进度。flag 置 1 表示数数完成。flag 置 0 表示给对方发送信号完成。 问题出现的位置,在父子进程 kill 函数之后需要紧接着调用 flag,将其置 0,标记信号已经发送。但,在这期 间很有可能被 kernel 调度,失去执行权利,而对方获取了执行时间,通过发送信号回调捕捉函数,从而修改了全局 的 flag。
如何解决该问题呢?可以使用后续课程讲到的“锁”机制。当操作全局变量的时候,通过加锁、解锁来解决该 问题。
现阶段,我们在编程期间如若使用全局变量,应在主观上注意全局变量的异步 IO 可能造成的问题。
有两个进程对同一个变量进行操作。

可/不可重入函数

一个函数在被调用执行期间(尚未调用结束),由于某种时序又被重复调用,称之为“重入”。根据函数实现的方 法可分为“可重入函数”和“不可重入函数”两种

例如:

显然,insert 函数是不可重入函数,重入调用,会导致意外结果呈现。究其原因,是该函数内部实现使用了全 局变量

注意事项

  1. 定义可重入函数,函数内不能含有全局变量及 static 变量,不能使用 malloc、free
  2. 信号捕捉函数应设计为可重入函数
  3. 信号处理程序可以调用的可重入函数可参阅 man7signal
  4. 没有包含在上述列表中的函数大多是不可重入的,其原因为:
    a) 使用静态数据结构
    b) 调用了 malloc 或 free
    c) 是标准 I/O 函数

Linux系统编程---8(全局变量异步I/O,可重入函数)相关推荐

  1. Linux系统编程34:进程信号之可重入函数,volatile关键字的作用和SIGHLD

    文章目录 (1)可重入函数 (2)volatile关键字 A:背景知识 B:产生的问题 C:volatile关键字 (3)SIGHLD信号 A:复习僵尸进程 B:清理僵尸状态的新方法-SIGCHLD ...

  2. Linux系统编程之进程控制(进程创建,fork函数,进程中止,进程等待,程序替换)

    进程创建 fork()------复制,返回值,写时复制 vfork()创建子进程-子进程与父进程共用同一块虚拟地址空间, 为了防止调用栈混乱,因此阻塞父进程直到子进程调用exit()退出或者进行程序 ...

  3. linux系统编程之进程(五):exec系列函数(execl,execlp,execle,execv,execvp)使用

    本节目标: exec替换进程映像 exec关联函数组(execl.execlp.execle.execv.execvp) 一,exec替换进程映像 在进程的创建上Unix采用了一个独特的方法,它将进程 ...

  4. 【README】Linux系统编程必读:本专栏内容提要以及系统调用接口总结

    文章目录 前言 第一部分:博客知识点 (1)基础篇 Linux系统编程1:Linux中使用率最高的一些命令 Linux系统编程2:详解Linux中的权限问题 Linux系统编程3:基础篇之详解Linu ...

  5. linux系统发送信号的系统调用是,linux系统编程之信号:信号发送函数sigqueue和信号安装函数sigaction...

    信号发送函数sigqueue和信号安装函数sigaction sigaction函数用于改变进程接收到特定信号后的行为. sigqueue()是比较新的发送信号系统调用,主要是针对实时信号提出的(当然 ...

  6. linux线程并不真正并行,Linux系统编程学习札记(十二)线程1

    Linux系统编程学习笔记(十二)线程1 线程1: 线程和进程类似,但是线程之间能够共享更多的信息.一个进程中的所有线程可以共享进程文件描述符和内存. 有了多线程控制,我们可以把我们的程序设计成为在一 ...

  7. Linux系统编程 复习笔记

    4 文件IO 操作 #include<fcntl.h> #include<unistd.h>#include<sys/types.h> creat int fd=c ...

  8. Linux系统编程笔记

    文章目录 1.Linux系统编程 2.文件IO 2.1 文件描述符 2.2 open 2.3 perror 2.4 close 2.5 write 2.6 read 2.7 remove 2.8 系统 ...

  9. Linux系统编程【文件IO、进程、进程间通信、信号、线程、互斥】

    linux系统编程 个人通过学习,手打了一份48000字的Linux系统编程的笔记,包含了[文件IO.进程.进程间通信.信号.多线程.互斥]等知识点,并给出了大量的代码案例对每个重要的知识点进行了代码 ...

最新文章

  1. 解决input[type=number]无法显示非数字字符的问题
  2. mysql常见关键字
  3. sonarqube报错解决办法:Caused by: java.io.FileNotFoundException: /opt/sonar/temp/sharedmemory (权限不够)
  4. 组合问题 已知组合数_组合和问题
  5. 进程(并发,并行) join start 进程池 (同步异步)
  6. 可支持任意级选择器级联的控件函数
  7. remote验证方法请求没有发送
  8. c8815 android os,华为C8815官方原厂固件rom系统刷机包_最新升级包降级包下载
  9. mac上php的集成环境
  10. Vue的MVVM框架
  11. android设置字体大小,Android中如何设置字体大小
  12. 解决ThinkPad早期笔记本Broadcom博通系列无线网卡Win10掉线、受限、速度慢问题(ThinkPad E530为例)
  13. 三菱电梯开门键一直亮_电梯反复开关门是什么原因?
  14. c语言让数码管显示时间,请问51单片机肿么编写程序让8个数码管显示时间(时分秒)...
  15. 谷粒商城分布式基础篇1-个人版
  16. 全民一起玩Python提高篇第十二课:面向对象基本原理与语法(三)
  17. 用python写一个自动注册脚本_python实现自动登录
  18. apple tv 开发_Apple TV首批#madewithunity游戏发售
  19. 浏览器的判断和Window系统是64位还是32位的判断
  20. 社会工程学工具 SET 伪造网站

热门文章

  1. perl 用网易发邮件报错 554 DT:SPM 163 smtp14
  2. docker 出现 Error response from daemon
  3. node.js 初体验
  4. 360浏览器兼容问题
  5. 机器学习降维算法一:PCA(主成分分析算法)
  6. ajax 复制到“剪贴板”
  7. 张向东:就以当年期望别人对我们那样的方式
  8. 南邮java实验报告,南邮微机原理实验报告精选.doc
  9. python concat_python中merge、concat用法
  10. android 网易item广告,Android仿网易严选商品详情页