1. 相关接口

        pause 函数用于将进程挂起. 如果信号的处理动作是终止进程, 则进程终止, pause 函数没有返回值; 如果信号的处理动作是忽略, 则进程被挂起, pause函数不返回, 如果信号的处理动作是捕捉, 则调用信号处理动作之后pause 返回 -1.
  2. 来看一段代码
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<signal.h>
#include<sys/types.h>
#include<unistd.h>void sig_alarm(int seconds)
{}
int mysleep(int seconds)
{struct sigaction act;struct sigaction oact;int unslept = 0;act.sa_handler = sig_alarm;act.sa_flags = 0;sigemptyset(&act.sa_mask);sigemptyset(&oact.sa_mask);sigaction(SIGALRM, &act, &oact);alarm(seconds);pause();unslept = alarm(0);sigaction(SIGALRM, &oact, NULL);
}
int main()
{while(1){mysleep(5);printf("5 seconds after\n");}return 0;
} 

                              
    上面代码是用来自主实现一个 sleep 函数. 先将 SIGALRM 信号注册,然后设定一个闹钟, 接着系统调用 pause 函数等待, 在 nsecs 秒之后, 闹钟设定的时间到了, 此时内核给进程发送一个 SIGALRM 信号, 当内核正要切回到用户态时, 发现一个可以递达的信后 SIGALRM, 它的处理动作是 sig_alrm, 此时内核有切回到 这个函数处取执行该信号的自定义动作, 在处理 sig_alrm 函数时, 系统将 SIGALRM 信号屏蔽, 当处理完这个函数时, 对 SIGALRM 函数解除屏蔽, 同时系统通过调用 sigreturn 函数返回到内核态, 接着从内核态返回到 主控制流处, 执行剩余的代码
    (1)也许会有人问信号处理 sig_alrm 函数时什么都没有干为什么还要注册, 原因很简单, 如果对 SIGALRM 信号不注册, 当注册一个 5 秒的闹钟信号时,5 秒之后该信号会被递达, 而此时的信号没有注册,信号的处理动作将会是终止进程, 此时进程终止, 程序退出, 而我们要实现的是将进程睡眠 5 秒钟, 那不就和我们的目的有冲突了吗?
    (2)也许还会有人问, 为什么在sleep函数之后需要对 SIGALRM 信号的默认处理动作进行恢复, 原因很简单. 加入这个代码很长, 而我们在 sleep 函数之后系统又用到了 SIGALRM 信号, 而此时我们的目的是在 n 秒之后操作系统给进程发送一个 SIGALRM 信号来终止信号, 而此时我们没有将该信号的处理动作进行恢复, 进程会去执行 sig_alrm 函数, 此时进程就不会在 5 秒之后退出
3. 可重入函数
    (1)定义 :
        重入的意思就是函数在被不同的执行流调用, 有可能在第一个执行流还没有执行完的时候又被第二个执行流调用. 而此时可能会由于重入导致一些错误, 此时的函数称为不可重入函数, 而当第一个执行流还没有执行完时, 第二个执行流进入, 此时没有导致函数执行功能发生错误, 此时这个函数就叫做可重入函数.
    (2)条件:
        如果一个函数调用了 malloc , free, 或者标准库 I/O函数,等全局变量的时候这个函数就叫做不可重入函数, 而如果一个函数只调用了自己的局部变量, 此时的函数叫做可重入函数,因为系统函数和主控制流各自独立拥有自己的堆栈, 不存在调用关系, 因此两个互不干扰

进程的挂起以及可重入函数相关推荐

  1. 2信号处理之:信号产生原因,进程处理信号行为,信号集处理函数,PCB的信号集,sigprocmask()和sigpending(),信号捕捉设定,sigaction,C标准库信号处理函数,可重入函数,

     1信号产生原因 2.进程处理信号行为 manpage里信号3中处理方式: SIG_IGN SIG_DFL                                            默 ...

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

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

  3. Linux进程信号(产生、保存、处理)/可重入函数概念/volatile理解/SIGCHLD信号

    首先区分一下Linux信号跟进程间通信中的信号量,它们的关系就犹如老婆跟老婆饼一样,没有一毛钱的关系. 信号的概念 信号的概念:信号是进程之间事件异步通知的一种方式,属于软中断.比如:红绿灯是一种信号 ...

  4. C语言之可重入函数 和不可重入函数

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

  5. 线程安全与可重入函数的区别及联系

    一.线程安全 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的.  或者 ...

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

    可重入函数 可重入函数(即可以被中断的函数)可以被一个以上的任务调用,而不担心数据破坏.可重入函数在任何时候都可以被中断,而一段时间之后又可以恢复运行,而相应的数据不会破坏或者丢失. 可重入函数使用的 ...

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

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

  8. 14.线程安全?线程不安全?可重入函数?不可重入函数?

    线程安全问题 基本定义 线程安全:简单来说线程安全就是多个线程并发执行同一段代码时,不会出现不同的结果,我们就可以说该线程是安全的: 线程不安全:如果多线程并发执行时会产生不同的结果,则该线程就是不安 ...

  9. UNIX再学习 -- 可重入函数和 SIGCHLD 语义

    一.可重入函数 参与信号处理的函数必须是可重入函数. 1.何为重入? 假设进程的住控制流程此刻正在调用 foo 函数,就在 foo 函数刚执行到一半的时候,内核向进程递送了信号 a:假设进程对信号 a ...

最新文章

  1. 3D U-Net:从稀疏注释中学习密集的体积分割
  2. 【DBMS 数据库管理系统】OLAP 核心技术 : 数据方体 ( 数据方体 | 数据方体格结构 | 数据单元 )
  3. BZOJ 3101: N皇后 构造
  4. Oracle 其他数据库对象
  5. Effective Java之使类和成员的可访问性最小化(十三)
  6. Python介绍与特点(自学python知识整理)
  7. php 通过坐标获取省市,PHP根据经纬度获取在范围坐标的数据
  8. zend optimizer php5.5,PHP_PHP5.3以上版本安装ZendOptimizer扩展,现在很多PHP程序都需要ZendOptimi - phpStudy...
  9. 阅读笔记一之《软件需求与分析》
  10. IOS9.0 导航栏状态栏
  11. 六款值得推荐的Android开源框架简介
  12. 20190912:(leetcode习题)3的幂
  13. 初识STM32F407芯片
  14. 设计并实现一个员工(Employee)类(C++)
  15. mysql jdbc 绑定变量_「MySQL高级特性——绑定变量」- 海风纷飞Blog
  16. 年龄识别数据集IMDB-WIKI
  17. 上海法官招嫖爆料者讲述始末
  18. 微信银行突破单一模式功能日渐强大
  19. “因遭勒索软件攻击,我被认定工作失职开除,并被老东家索赔 21.5 万元”
  20. 如何在支付宝开直播,这篇入驻教程不要错过,看完你就会了

热门文章

  1. 辨异 —— 行星 vs 恒星
  2. java学习_File属性处理
  3. 面试题-ASP 与 ASP.Net的区别?
  4. ajax包含mysql吗_php 实例ajax与mysql怎么只查询出一条数据?
  5. android病毒下载地址,LINE病毒查杀
  6. linux制作一键恢复,Linux/Centos Mondo 一键部署、镜像恢复,快速部署
  7. apache gobblin mysql_gobblin简单使用
  8. 名为 cursor_jinserted 的游标不存在_质量工程师必须了解的测量常识,你不知道怎么行...
  9. 咸宁省2021年模拟高考成绩查询怎么查,2021咸宁市地区高考成绩排名查询,咸宁市高考各高中成绩喜报榜单...
  10. nacos配置ap_Nacos 1.0.0 功能预览