Shell
要先讲信号的话,先要了解一下shell程序的内容,正如上次所提到的一样,我们只有一种方法在Linux下创建进程,那就是使用fork调用
Linux Process Hierarchy
Shell Programs
shell是以用户身份执行程序的程序
Problem with Simple Shell Example
简单shell存在一个问题,shell会等待收割前台的工作。那么后台的工作呢?
- 停止时变成“僵尸”
- 由于shell不停止永远不会被替换
- 创造引发内存耗尽的内存泄漏
ECF to the Rescue!
解决办法:Exceptional control flow
当后台进程完成时,内核会干扰打断常规的进程发送警告,在unix下,警告机制叫做sinal【信号】。
Signals
信号和上节课学习的异常机制很像,除了它是完全由软件实现的。
当我们在命令行按下ctrl+c的时候会触发sigint信号,内核像每个进程发送信号,收到sigint时的默认操作是终止任务。
SIGKILL和SIGINT效果是一样的,都是kill了进程。
SIGCHLD这个信号是每当子进程被终止或者结束的时候kernel就会通知它们的父进程,我们会看到这就是shell回收进程的做法。
Signal Concepts: Sending a Signal
Signal Concepts: Receiving a Signal
收到信号是目标进程最终发生的事情,内核强制它以某种方式作出响应。
Signal Concepts: Pending and Blocked Signals
Sending Signals: Process Groups
Sending Signals with /bin/kill Program
Sending Signals from the Keyboard
Receiving Signals
Signals Handlers as Concurrent Flows
信号是并发的一种形式。
Another View of Signal Handlers as Concurrent Flows
Nested Signal Handlers
Guidelines for Writing Safe Handlers
后面就开始听不懂了。。。网上也有小伙伴留言是这样。。。哈哈哈