1. 概念--什么是信号
信号是事件发生时对进程的通知机制,有时也称之为软件中断。
在linux的操作系统中<signal.h> 以SIGxxxx的形式指代一种信号,他们实际上都是小整数的宏。
2. 信号的分类
1>用于内核向应用程序通知事件
2> 由实时信号构成
具体差异还得之后再改笔记
3. 什么情况下会引发信号
1> 硬件检测到错误并通知内核
2>用户输入了某种终端字符
3>发生软件时间 某一些定义的情况发生时会引发的信号
4. 对于信号的处理
引言:信号的传送
当当信号送达的时候,如果目标进程正在运行则可以立即接受信号并处理,当想要一段代码不会被信号中断,那么可以临时将信号加入到进程的信号掩码中(也就是将此信号阻塞了),等到希望处理该信号的时候再将信号从信号掩码中取出(解除阻塞)。这些操作均可使用系统调用完成。
1>程序默认操作
- 忽略信号:也就是说进程将信号丢弃
- 终止(杀死进程): 有时指的是异常终止进程而不是调用exit();函数的正常退出
- 产生核心转储文件同时进程终止 比如abort(); 函数引发的SIGABRT信号
- 停止进程:也就是暂停进程
- 恢复暂停的进程
2> 程序对于信号的设置的处理
- 采取默认行为,看上述
- 忽略信号 主要作用是让那些使进程终止的信号被屏蔽掉
- 执行信号处理器函数
5. 具体信号类型,及他们的默认行为
引言:linux中的标准信号共1~31 一共31个 还有其他的好多主要是为了兼容性 通过signal(7) 手册可查到所有的信号
- SIGABRT 当进程调用abort();函数时系统会向进程发送该信号默认情况下会生成核心转储文件并结束进程
- SIGALRM 经调用alarm(); 或者setitimer(); 设置的实时定时器一旦到期 内核将产生该信号
- SIGBUG 内存访问错误的时候 如mmap()创建后访问超过结尾
- SIGCHLD 父进程的某一个子进程终止的时候会向父进程发送此信号 当子进程收到信号停止或恢复的时候也有可能发送该信号
- SIGCLD 与SIGCHLD 意义一样
- SIGCONT 发送给停止的进程使它恢复,但是对于没有停止的进程,该进程将忽略这个信号
- SIGEMT 一个硬件错误,知道就好
- SIGFPE 由算术运算的的错 误而产生比如除以0
- SIGHUP 当终端断开的时候 将发送这个信号给终端控制程序,当大多数的守护进程收到该信号的时候会重新读取配置文件也就是说会重启
- SIGILL 执行格式不正确的(非法的)机器语言指令则给进程发送这个信号
- SIGINFO 用