系统编程-信号(akae-linux-system-programming-signallinux).pdf
《系统编程-信号(akae-linux-system-programming-signallinux).pdf》由会员分享,可在线阅读,更多相关《系统编程-信号(akae-linux-system-programming-signallinux).pdf(69页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Linux 系统编程系统编程-信号信号杨劲松 yjsoldhand.org2010.04.26北京亚嵌教育研究中心2010 AKAEhttp:/www.akaedu.org/205/17/11课程目标掌握 Linux 系统信号的相关知识掌握 Linux 系统信号处理方法了解 Linux 内核中关于信号的实现机制了解可重入问题及解决方法了解竞态条件问题及解决方法http:/www.akaedu.org/305/17/11参考资料亚嵌教育 Linux 系统编程第 6 章 信号W.Richard Stevens UNIX 环境高级编程第 10 章 信号IBM Developer worksLinux
2、 环境进程间通信(二):信号(上)-http:/ 环境进程间通信(二):信号(下)-http:/ the Linux Kernel 2nd edition-http:/yhs.superuser.co.kr/data/anatomy%20of%20linux/data/UnderstandingTheLinuxKerne%202ndEdition.pdfhttp:/www.akaedu.org/405/17/11内容大纲概述认识信号信号的概念信号的产生条件信号的处理方式信号列表信号的默认处理方式信号用途信号本质信号来源信号分类使用信号产生信号通过终端按键产生信号调用系统函数向进程发信号由软件条
3、件产生信号http:/www.akaedu.org/505/17/11内容大纲(cont.)阻塞信号信号的生命周期信号在内核中的表示信号集及其操作函数sigprocmask()sigpending()捕捉信号内核如何实现信号的捕捉signal()sigaction()其他的问题信号与进程中断的系统调用可重入问题竞态条件与 sigsuspend()函数SIGCHLD 信号http:/www.akaedu.org/605/17/111.概述 主要内容认识信号信号的概念信号的产生条件信号的处理方式信号列表信号的默认处理方式信号用途信号本质信号来源信号分类使用信号http:/www.akaedu.or
4、g/705/17/111.1 概述 认识信号先从我们最熟悉的场景说起用户输入命令,在 Shell 下启动一个前台进程用户按下 Ctrl-C,这个键盘输入产生一个硬件中断-Ctrl-C 产生的信号只能发给前台进程如果 CPU 当前正在执行这个进程的代码,则该进程的用户空间代码暂停执行,CPU 从用户态切换到内核态处理硬件中断终端驱动程序将 Ctrl-C 解释成一个 SIGINT 信号,记在该进程的PCB 中(也可以说发送了一个 SIGINT 信号给该进程)。当某个时刻要从内核返回到该进程的用户空间代码继续执行之前,首先处理 PCB 中记录的信号,发现有一个 SIGINT 信号待处理,而这个信号的
5、默认处理动作是终止进程,所以直接终止进程而不再返回它的用户空间代码执行-信号相对于进程的控制流程来说是异步(Asynchronous)的http:/www.akaedu.org/805/17/111.1 概述 认识信号信号是软件中断很多比较重要的应用程序都需处理信号信号提供了一种处理异步事件的方法:终端用户键入中断键,则会通过信号机制停止一个程序产生信号的事件对进程而言是随机出现的如果处理不当,信号会造成程序运行状态的混乱http:/www.akaedu.org/905/17/111.2 信号的概念每个信号都有一个名字,这些名字都以三个字符 SIG 开头SIGABRT 是夭折信号,当进程调用
6、abort()函数时产生这种信号。SIGALRM 是闹钟信号,当由 alarm()函数设置的时间已经超过后产生此信号在头文件 中,信号都被定义为正整数(信号编号),没有一个信号其编号为 0http:/www.akaedu.org/1005/17/111.3 概述-信号的产生条件用户在终端按下某些键时,终端驱动程序会发送信号给前台进程Ctrl-C 产生 SIGINT 信号Ctrl-产生 SIGQUIT 信号Ctrl-Z 产生 SIGTSTP 信号-可使前台进程停止,这个信号通常用于作业控制硬件异常产生信号,这些条件由硬件检测到并通知内核,然后内核向当前进程发送适当的信号当前进程执行了除以 0 的
7、指令,CPU 的运算单元会产生异常,内核将这个异常解释为 SIGFPE 信号发送给进程当前进程访问了非法内存地址,MMU 会产生异常内核将这个异常解释为 SIGSEGV信号发送给进程一个进程调用 kill(2)可以发送信号给另一个进程另一个进程如何处理?通过 kill(1)发送信号给某个进程kill(1)通过调用 kill(2)实现的如果不明确指定信号则发送 SIGTERM 信号,该信号的默认处理动作是终止进程。当内核检测到某种软件条件发生时也可以通过信号通知进程,例如闹钟超时产生 SIGALRM 信号,向读端已关闭的管道写数据时产生 SIGPIPE 信号http:/www.akaedu.or
8、g/1105/17/111.4 概述 信号的处理方式用户程序可以调用 signal(2)或者 sigaction(2)通知内核如何处理某种信号信号有三种处理方式忽略信号-大多数信号都可使用这种方式进行处理,-但有两种信号(SIGKILL 和 SIGSTOP)却决不能被忽略-其原因是:它们向超级用户提供一种使进程终止或停止的可靠方法。另外,如果忽略某些由硬件异常产生的信号(例如非法存储访问或除以 0),则进程的行为是未定义的。捕捉信号-为了做到这一点要通知内核在某种信号发生时,调用一个用户函数。在用户函数中,可执行用户希望对这种事件进行的处理。-若编写一个命令解释器,当用户用键盘产生中断信号时,
9、很可能希望返回到程序的主循环,终止系统正在为该用户执行的命令。-如果捕捉到 SIGCHLD 信号,则表示子进程已经终止,所以此信号的捕捉函数可以调用 waitpid()以取得该子进程的进程 ID 以及它的终止状态。-如果进程创建了临时文件,那么可能要为 SIGTERM 信号编写一个信号捕捉函数以清除临时文件(kill(1)命令传送的系统默认信号是终止信号)。执行系统默认动作http:/www.akaedu.org/1205/17/111.5 概述 信号列表使用 kill-l 命令查看信号http:/www.akaedu.org/1305/17/111.5 概述 信号列表Signals desc
10、ribed in the original POSIX.1-1990 standardhttp:/www.akaedu.org/1405/17/111.5 概述 信号列表Signals not in the POSIX.1-1990 standard but described in SUSv2 and POSIX.1-2001.SUSv2-Single UNIX Specification Version 2http:/www.akaedu.org/1505/17/111.5 概述 信号列表 Other signalshttp:/www.akaedu.org/1605/17/111.6 信号
11、的默认处理方式http:/www.akaedu.org/1705/17/111.6 信号的默认处理方式(续)“终止 w/core”表示在进程当前工作目录的 core 文件中复制了该进程的存储图像http:/www.akaedu.org/1805/17/111.7 信号用途 SIGABRT 调用 abort 函数时产生此信号,进程异常终止SIGALRM 超过用 alarm 函数设置的时间时产生此信号SIGBUS 指示一个实现定义的硬件故障。SIGCHLD 在一个进程终止或停止时,SIGCHLD 信号被送给其父进程SIGCONT 此作业控制信号送给需要继续运行的处于停止状态的进程。如果接收到此信号
12、的进程处于停止状态,则系统默认动作是使该进程继续运行,否则默认动作是忽略此信号。SIGEMT 指示一个实现定义的硬件故障SIGFPE 此信号表示一个算术运算异常,例如除以 0,浮点溢出等。SIGHUP 如果终端界面检测到一个连接断开,则将此信号送给与该终端相关的控制进程(对话期首进程)SIGILL 此信号指示进程已执行一条非法硬件指令SIGINFO 当用户按状态键(一般采用 Ctrl-T)时,终端驱动程序产生此信号并送至前台进程组中的每一个进程SIGINT 当用户按中断键(一般采用 Delete 或 Ctrl-C)时,终端驱动程序产生此信号并送至前台进程组中的每一个进程SIGIO 此信号指示一
13、个异步 I/O 事件http:/www.akaedu.org/1905/17/111.7 信号用途(续)SIGIOT 这指示一个实现定义的硬件故障SIGKILL 这是两个不能被捕捉或忽略信号中的一个,它向系统管理员提供了一种可以杀死任一进程的可靠方法SIGPIPE 如果在读进程已终止时写管道,则产生此信号SIGPOLL 这是一种 SVR4 信号,当在一个可轮询设备上发生一特定事件时产生此信号SIGPROF 当 settitimer(2)函数设置的梗概统计间隔时间已经超过时产生此信号SIGPWR 这是一种 SVR4 信号,它依赖于系统。它主要用于具有不间断电源(UPS)的系统上。如果电源失效,则
14、 UPS 起作用,而且通常软件会接到通知。SIGQUIT 当用户在终端上按退出键(一般采用 Ctrl-)时,产生此信号,并送至前台进程组中的所有进程SIGSEGV 指示进程进行了一次无效的存储访问SIGSTOP 这是一个作业控制信号,它停止一个进程SIGSYS 指示一个无效的系统调用SIGTERM 这是由 kill(1)命令发送的系统默认终止信号http:/www.akaedu.org/2005/17/111.7 信号用途(续)SIGTRAP 指示一个实现定义的硬件故障SIGTSTP 交互停止信号,当用户在终端上按挂起键(一般采用 Ctrl-Z)时,终端驱动程序产生此信号SIGTTIN 当一个
15、后台进程组进程试图读其控制终端时,终端驱动程序产生此信号SIGTTOU 当一个后台进程组进程试图写其控制终端时产生此信号SIGURG 此信号通知进程已经发生一个紧急情况SIGUSR1 这是一个用户定义的信号,可用于应用程序SIGUSR2 这是一个用户定义的信号,可用于应用程序SIGVTALRM 当一个由 settitimer(2)函数设置的虚拟间隔时间已经超过时产生此信号SIGWINCH SVR4 和 4.3+BSD 内核保持与每个终端或伪终端相关联的窗口的大小SIGXCPU SVR4 和 4.3+BSD 支持资源限制的概念SIGXFSZ 如果进程超过了其软文件长度限制http:/www.ak
16、aedu.org/2105/17/111.8 概述 信号本质信号是在软件层次上对中断机制的一种模拟在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达信号是进程间通信机制中唯一的异步通信机制可以看作是异步通知,通知接收信号的进程有哪些事情发生了。信号机制经过 Posix 实时扩展后,功能更加强大,除了基本通知功能外,还可以传递附加信息http:/www.akaedu.org/2205/17/111.9 概述 信号来源信号事件的发生有两个来源硬件来源-键盘操作-其它硬件故障软件来源-k
17、ill(1),kill(2)-raise(),abort()-alarm(),setitimer(),sigqueue()-一些非法运算等操作http:/www.akaedu.org/2305/17/111.10 概述 信号分类 依据可靠性不可靠信号早期 UNIX 下的不可靠信号主要指的是进程可能对信号做出错误的反应以及信号可能丢失信号值小于 SIGRTMIN 的信号都是不可靠信号Linux 支持不可靠信号,但是对不可靠信号机制做了改进-在调用完信号处理函数后,不必重新调用该信号的安装函数-Linux 下的不可靠信号问题主要指的是信号可能丢失可靠信号在保留不可靠信号的前提下(由于原来定义的信号
18、已有许多应用,不好再做改动),又新增加了一些信号,并在一开始就把它们定义为可靠信号,这些信号支持排队,不会丢失信号的发送和安装也出现了新版本-信号发送函数 sigqueue()-信号安装函数 sigaction()Posix 对可靠信号机制做了标准化信号值位于 SIGRTMIN 和 SIGRTMAX 之间的信号都是可靠信号Linux 在支持新版本的信号安装函数 sigation()以及信号发送函数 sigqueue()-仍然支持早期的 signal()信号安装函数-支持信号发送函数 kill(2)http:/www.akaedu.org/2405/17/111.10 概述 信号分类 依据实时性
19、早期 UNIX 系统只定义了 32 种信号前 32 种信号已经有了预定义值,每个信号有了确定的用途及含义,并且每种信号都有各自的缺省动作-如按键盘的 Ctrl-C 时,会产生 SIGINT 信号,对该信号的默认反应就是进程终止后 32 个信号表示实时信号,等同于可靠信号保证了发送的多个实时信号都被接收。实时信号是 POSIX 标准的一部分,可用于应用进程非实时信号都不支持排队,都是不可靠信号实时信号都支持排队,都是可靠信号http:/www.akaedu.org/2505/17/111.11 概述 使用信号系统运行系统 shutdown 时发送 SIGTERM 通知所有的进程系统管理通过 ki
20、ll(1)来对进程进行管理进程调度信号驱动 I/O进程间通讯用于同步用于通知-SIGCHLD-SIGALRMhttp:/www.akaedu.org/2605/17/112.产生信号 主要内容通过终端按键产生信号调用系统函数向进程发信号由软件条件产生信号http:/www.akaedu.org/2705/17/112.1 产生信号-通过终端按键产生信号验证 SIGQUITSIGQUIT 的默认处理动作是终止进程并且 Core Dump-Core dump当一个进程要异常终止时,可以选择把进程的用户空间内存数据全部保存到磁盘上,文件名通常是 core,这叫做 Core dump进程异常终止通常是
21、因为有 bug,比如非法内存访问导致段错误,事后可以用调试器检查 core 文件以查清错误原因,这叫做 Post-mortem Debug(事后调试,验尸调试)。一个进程允许产生多大的 core 文件取决于进程的 Resource Limit(这个信息保存在 PCB 中)。默认是不允许产生 core 文件的,因为 core 文件中可能包含用户密码等敏感信息,不安全。在开发调试阶段可以用 ulimit 命令改变这个限制,允许产生 core 文件。SIGQUIT 信号可以通过 Ctrl-产生http:/www.akaedu.org/2805/17/112.1 产生信号-通过终端按键产生信号验证代码
22、运行 test1 之后,键盘输入 Ctrl-,屏幕输出 Quit(core dumped)http:/www.akaedu.org/2905/17/112.2 产生信号-调用系统函数向进程发信号通过 kill(1)发送信号,相当于调用 kill(2)参数:SIGhttp:/www.akaedu.org/3005/17/112.2.1 kill(2)/raise(3)kill(2)函数将信号发送给进程或进程组raise(3)函数则允许进程向自身发送信号pid0 将信号发送给进程 ID 为 pid 的进程。pid=0 将信号发送给其进程组 ID 等于发送进程的进程组 ID,而且发送进程有许可权向其
23、发送信号的所有进程。pid0 将信号发送给其进程组 ID 等于 pid 绝对值,而且发送进程有许可权向其发送信号的所有进程。pid=-1 将信号发送给所有的进程raise(sig)等价于 kill(getpid(),sig)http:/www.akaedu.org/3105/17/112.2.2 产生信号 kill(2)kill(1)命令是调用 kill(2)系统调用实现的kill(2)可以给一个指定的进程发送指定的信号http:/www.akaedu.org/3205/17/112.2.3 产生信号 raise(3)raise(3)函数可以给当前进程发送指定的信号(自己给自己发信号)等价于
24、kill(getpid(),sig)http:/www.akaedu.org/3305/17/112.2.4 产生信号 abort(3)abort(3)函数使当前进程接收到 SIGABRT 信号而异常终止http:/www.akaedu.org/3405/17/112.3 产生信号-由软件条件产生信号SIGPIPE 是一种由软件条件产生的信号如果所有指向管道读端的文件描述符都关闭了(管道读端的引用计数等于 0),这时有进程向管道的写端 write,那么该进程会收到信号 SIGPIPE,通常会导致进程异常终止。网络编程中也会有同样的问题调用 alarm()函数可以设定一个闹钟,即告诉内核在 se
25、conds 秒之后给当前进程发 SIGALRM 信号,该信号的默认处理动作是终止当前进程http:/www.akaedu.org/3505/17/112.3.1 产生信号-alarm(2)使用 alarm()函数可以设置一个时间值(闹钟时间),在将来的某个时刻该时间值会被超过。当所设置的时间值被超过后,产生 SIGALRM信号。如果不忽略或不捕捉此信号,则其默认动作是终止该进程。alarm()的参数 seconds 的值是秒数,经过了指定的 seconds 秒后会产生信号SIGALRM每个进程只能有一个闹钟时间。如果在调用 alarm()时,以前已为该进程设置过闹钟时间,而且它还没有超时,则该
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 系统 编程 信号 akae linux system programming signallinux
链接地址:https://www.taowenge.com/p-70321671.html
限制150内