下表列出了每种信号的默认处理动作(有些实现支持更多信号),以及支持此信号的系统。其中,SUS 列中的“*”表示此种信号定义为基本 POSIX.1 规范部分,“XSI”表示该信号定义为 XSI 扩展部分。而系统默认动作列中的“终止+core”表示在进程当前工作目录的 core 文件中复制了该进程的内存映像(大多数 UNIX 系统调试程序都使用 core 文件检查进程终止时的状态)。
[img]http://dl2.iteye.com/upload/attachment/0127/1825/aba2aed0-9d60-3684-a35a-7447f3c394ad.png[/img]
这里需要了解的是,在不同的实现中,core 文件的名字可能不同。例如,在 FreeBSD 8.0 中,core 文件名是 cmdname.core,其中 cmdname 是接收到信号的进程所执行的命令名;在 Mac OS 10.6.8 中,core 文件名是 core.pid,其中 pid 是接收到信号的进程的 ID。这些系统允许经 sysctl 参数配置 core 文件名,如 Linux 3.2.0 可通过 /proc/sys/kernel/core_pattern 进行配置。多数实现在相应进程的工作目录中包含 core 文件项,但 Mac OS X 将所有 core 文件都放在 /cores 目录中。
另外,在下列条件下不产生 core 文件:
(1)进程是设置用户 ID 的,而且当前用户并非程序文件的所有者。
(2)进程是设置组 ID 的,而且当前用户并非该程序文件的组所有者。
(3)用户没有写当前工作目录的权限。
(4)文件已存在,而且用户对该文件没有写权限(core 文件的权限通常是用户读/写)。
(5)文件太大。

进程捕捉到信号并对其进行处理时,它就会临时中断正在执行的正常指令序列,转而执行信号处理程序中的指令,在从信号处理程序返回后(如没有调用 exit 或 longjmp)又继续执行。但在信号处理程序中,不能判断捕捉到信号时进程执行到何处。如果进程正在执行 malloc,就可能会对进程造成破坏,因为 malloc 通常为它所分配的存储区维护一个链表,而插入执行信号处理程序时,进程可能正在更改此链表。再比如,若进程正在执行 getpwnam 这种将其结果存放在静态存储单元中的函数,其间插入执行信号处理程序,它又调用这样的函数,则返回给正常调用者的信息就可能会被覆盖。
下表列出了 Single UNIX Specification 说明的在信号处理程序中保证调用安全的函数,它们是可重入的,并被称为异步信号安全的。此外,在信号处理操作期间,它们会阻塞任何会引起不一致的信号发送。
[img]http://dl2.iteye.com/upload/attachment/0127/2221/0ddfa35f-8077-3b25-81a7-2717bf324a7a.png[/img]
不在该表中的大多数是不可重入的,因为(a)已知它们使用静态数据结构;(b)它们调用 malloc 或 free;(c)它们是标准 I/O 函数(标准 I/O 库的很多实现都以不可重入方式使用全局静态数据结构)。不过即使信号处理程序调用的是上表中的函数,但由于每个线程只有一个 errno 变量,所以信号处理程序可能会修改其原先值。因此,应当在信号处理程序中调用上图中的函数前保存 errno,调用后再恢复 errno。
注意,上图中没有包含 longjmp 和 siglongjmp 之类的函数,因为主例程以非可重入方式正在更新一个数据结构时可能产生信号。如果不是从信号处理程序返回而是调用 siglongjmp,那么该数据结构可能是部分更新的。如果要做到更新全部数据结构,而同时要捕捉某些信号,而这些信号的处理程序又会引起执行 siglongjmp,则在更新时要阻塞此类信号。

信号默认处理动作及可重入函数相关推荐

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

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

  2. 可重入函数、不可重入函数,注意事项

    1.定义可重入函数,函数内不能含有全局变量及static变量,不能使用malloc.free 2.信号捕捉函数应设计为可重入函数 3.信号处理程序可以调用的可重入函数可参阅 man 7 signal ...

  3. linux操作系统之全局异步IO及可重入/不可重入函数

    (1)全局变量异步I/O实现父子进程交替数数 1)信号捕捉函数 2)main函数实现信号交替 3)程序实现 1>创建子进程,父进程等待1s,等待子进程完成捕捉函数注册(捕捉信号SIGUSR1). ...

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

    全局变量异步 I/O 分析如下父子进程交替 数数 程序.当捕捉函数里面的 sleep 取消,程序即会出现问题.请分析原因. #include<stdio.h> #include<si ...

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

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

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

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

  7. [ Linux ] 可重入函数,volatile 关键字,SIGCHLD信号

    目录 1.可重入函数 2.volatile 2.1从信号角度理解volatile的作用 2.2volatile的作用 3.SIGCHLD信号 3.1SIGCHLD信号的验证 1.可重入函数 在数据结构 ...

  8. Linux | 可重入函数 | volatile | SIGCHLD信号

    文章目录 可重入函数 可重入与线程安全 volatile volatile和const同时修饰变量 SIGCHLD信号 可重入函数 当一个函数可以被两个执行流调用,我们称该函数具有重入特征 如果一个函 ...

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

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

最新文章

  1. 怎么请假显智商高?评论区亮了! | 每日趣闻
  2. gcc的安装----rpm包安装顺序
  3. fastreport 旋转90度_水冷必不可少之90度弯头
  4. 支付宝一键清除首页各种广告
  5. ARM汇编EQU伪指令
  6. java class多重泛型_多重继承求泛型类的类型
  7. [XA]读书感想:个人对敏捷软件开发宣言的理解
  8. 程序阻碍OD调试的方式2
  9. cisco路由器OSPF基础配置命令
  10. 服务器备案问题解决思考?
  11. GestureDetector--手势识别初体验(一)
  12. 可用NVI模式替换virtual函数继承方式
  13. FPGA实验---数码管秒表显示实验
  14. UI设计初学者必入门必看!
  15. FME 2011预览:新特性 IFMEWorkspaceRunner
  16. CSS:三种背景(斑马线,棋盘,格子)
  17. 【win10+cuda7.5+cudnn6.0安装caffe⑥】报错及处理方式
  18. uni-app新闻小程序
  19. Docker-Compose 容器编排技术
  20. iOS 13 适配,关闭黑暗模式(夜间模式)

热门文章

  1. 背景图片背景颜色同时存在
  2. 十年全栈码农的武功修为(二)
  3. 2020 年 11 月福利,小伙伴们来领现金红包
  4. C语言100题第二题 编写函数fun()的功能并调用:从3个红球,5个白球,6个黑球中任意取8个 作为一组,进行输出。在每组中,可以没有黑球,但是必须有红球和白球。组合数作为函数返回值。
  5. Nerry实现服务器端指定客户端发送消息。
  6. 教你UPS电池估算方法,UPS配置不再难
  7. 用Python删除电脑空文件夹
  8. 幼儿体能五项技能测试软件,【星海园动态】“快乐运动,健康成长”—体能五项测查比赛活动...
  9. Java面向对象中 包装类(封装类)的详解
  10. java基本类型封装类和原始类型的区别及好处