0
点赞
收藏
分享

微信扫一扫

进程间通信(二十二)——信号处理函数

Mhhao 2022-03-21 阅读 136
linux

信号处理函数

信号的本质

  1. 是一种软中断,中断有优先级,信号也有优先级
  2. 信号处理函数类似于中断处理函数
  3. 信号也可以随时打断当前正在运行的程序,去运行信号处理函数

编程要点

  • 重入:可能在任何时刻、任意地点打断当前进程的执行

  • 尽量不要在处理函数中修改全局数据

  • 尽量使用可重入函数,被打断的进程可能正在调用不可重入函数

  • 难点:很难写出一个安全地、可重入的信号处理函数

     int sum;
     int add(int count)
     {
      	static int sum = 0;
    	for(i from 0 to count)
    		sum = sum + i;	 
     }
    

可重入函数

函数的可重入

  • 可重复调用、并发调用、可以被中断
  • 在多任务环境中,多次调用,不影响运行结果
  • 一般应用在多任务、多进程的运行环境中

可重入与线程安全

  • 可重入函数一定是线程安全的
  • 不可重入函数通过加锁访问全局变量,也是线程安全的。但仍是不可重入的
  • 如果一个函数对信号处理来说是可重入函数,则称其为异步信号安全函数,可重入函数跟信号安全函数可以看做等价的
  • 线程安全的函数,不一定是异步信号安全的

不可重入函数

满足条件

  • 函数内部使用了全局变量、静态局部变量
  • 函数返回全局变量或静态局部变量
  • 函数内部使用了malloc/free函数
  • 函数内部使用了标准I/O函数
  • 函数内部调用了其他不可重入函数

信号处理函数尽量调用可重入函数

信号处理函数要尽可能地短

举报

相关推荐

0 条评论