开发者学堂课程【物联网开发- Linux 高级程序设计全套视频:信号的概念】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/660/detail/11007
信号的概念
内容介绍
一、 信号的概述
二、 如何产生信号
三、 如何处理接收到的信号
一、信号的概述
信号是软件中断,它是在软件层次上对中断机制的一种模拟.
什么叫中断?
举例:假如你在家看电影,有人来敲门,你暂停电影去开门,开完门回来继续看电影,去开门这件事称为中断。中断又分为硬件中断和软件中断。
信号可以导致一个正在运行的进程被另一个正在运行的异步进程中断,转而处理某一个突发事件。
异步:
通讯双方不需要建立一个同步时钟,消息的出现是随机的。
信号是一种异步通信方式。
进程不必等待信号的到达,进程也不知道信号什么时候到达。
信号可以直接进行用户空间进程和内核空间进程的交互,内核进程可以利用它来通知用户空间进程发生了哪些系统事件。
解释:
如非法访问内存导致出现段错误,程序污染,硬件检测到然后通知内核,内核进程产生信号发送给正在运行的应用程序,应用程序收到信号暂停运行,这就是用户进程和内核进程通过信号交流的例子。
每个信号的名字都以字符SIG开头。
每个信号和一个数字编码相对应,在头文件sigmum.h中,这些信号都被定义为正整数。
信号名定义路径:/usr/include/i386-linux gnu/bits/signum.h
在Linux下,要想查看这些信号和编码的对应关系,可使用命令: kill-l
发信号的目的:通知事件
信号简要说明:
SIGHUP终止进程 终端线路挂断
SIGINT终止进程 中断进程
SIGQUIT建立CORE文件终止进程,并且生成core文件
SIGIL建立 CORE文件 非法指令
SIGTRAP建立CORE文件 跟踪自陷
SIGBUS建立CORE文件 总线错误
SIGSEGV建 立CORE文件 段非法错误
SIGFPE建立CORE文件 浮点异常
SIGIOT建立CORE文件 执行1/O自陷
SIGKILL终止进程 杀死进程
SIGPIPE终止进程 向一个没有读进程的管道写数据
SIGALARM终止进程 计时器到时
SIGTERM终止进程 软件终止信号
SIGSTOP停止进程 非终端来的停止信号
SIGTSTP停止进程 终端来的停止信号
SIGCONT忽略信号 继续执行一个停止的进程
SIGURG忽略信号 1/O紧急信号
SIGIO忽略信号 描述符上可以进行I/O
SIGCHLD忽略信号 当子进程停止或退出时通知父进程
SIGTTOU停止进程 后台进程写终端
SIGTTIN停止进程 后台进程读终端
SIGXGPU终止进程 CPU时限超时
SIGXFSZ终止进程 文件长度过长
SIGWINCH忽略信号 窗口大小发生变化
SIGPROF终止进程 统计分布图用计时器到时
SIGUSR1终止进程 用户定义信号1
SIGUSR2终止进程 用户定义信号2
SIGVTALRM终止进程 虚拟计时器到时
二、如何产生信号
1、当用户按某些终端键时,将产生信号。
例如:终端上按“Ctrl+c” 组合键通常产生中断信号SIGINT、 终端上按"Ctrl+\”键通常产生中断信号SIGQUIT.终端上按"Ctl+z"键通常产生中断信号 SIGSTOP。
2、硬件异常将产生信号。
除数为0,无效的内存访问等。这些情况通常由硬件检测到,并通知内核,然后内核产生适当的信号发送给相应的进程。
3、软件异常将产生信号。
当检测到某种软件条件已发生,并将其通知有关进程时,产生信号。
解释:
如将一个函数设定三秒钟之后自动给当前进程发送一个信号,这里的“三秒钟”则视为软件条件。
4、调用 kill 函数将发送信号。
注意:
接收信号进程和发送信号进程的所有者必须相同,或发送信号进程的所有者必须是超级用户号。
三、如何处理接收到的信号
1、执行系统默认动作
对大多数信号来说,系统默认动作是用来终止该进程。
2、忽略此信号
接收到此信号后没有任何动作。
3、执行自定义信号处理函数
注意:
SHRILL 和 SIGSTOP 不能更改信号的处理方式,因为它们向用户提供了一种使进程终止的可靠方法。