1. ⽤用户输⼊入命令,在Shell下启动⼀一个前台进程。
2. ⽤用户按下Ctrl-C,这个键盘输⼊入产⽣生⼀一个硬件中断。
3. 如果CPU当前正在执⾏行这个进程的代码,则该进程的⽤用户空间代码暂停执⾏行,CPU从⽤用户态 切换到内
核态处理硬件中断。
4. 终端驱动程序将Ctrl-C解释成⼀一个SIGINT信号,记在该进程的PCB中(也可以说发送了⼀一 个SIGINT
信号给该进程)。
5. 当某个时刻要从内核返回到该进程的⽤用户空间代码继续执⾏行之前,⾸首先处理PCB中记录的信号,发现
有⼀一个SIGINT信号待处理,⽽而这个信号的默认处理动作是终⽌止进程,所以直接终⽌止进程⽽而不再返回它
的⽤用户空间代码执⾏行
1. Ctrl-C产⽣生的信号只能发给前台进程。⼀一个命令 后⾯面加个&可以放到后台运⾏行,这样Shell不必等待进
程结束就可以接受新的命令,启动新的进程。
2. Shell可以同时运⾏行⼀一个前台进程和任意多个后台进程,只有前台进程才能接到像Ctrl-C这种控制键
产⽣生的信号。
3. 前台进程在运⾏行过程中⽤用户随时可能按下Ctrl-C⽽而产⽣生⼀一个信号,也就是说该进程的⽤用户空间代码执
⾏行到任何地⽅方都有可能收到SIGINT信号⽽而终⽌止,所以信号相对于进程的控制流程来说是异步
(Asynchronous)的。
. ⽤用户在终端按下某些键时,终端驱动程序会发送信号给前台进程,例如Ctrl-C产⽣生SIGINT信 号,Ctrl-
\产⽣生SIGQUIT信号,Ctrl-Z产⽣生SIGTSTP信号(可使前台进程停⽌止,这个信号将 在 后⾯面课程详细解
释)。
2. 硬件异常产⽣生信号,这些条件由硬件检测到并通知内核,然后内核向当前进程发送适当的信 号。例如
当前进程执⾏行了除以0的指令,CPU的运算单元会产⽣生异常,内核将这个异常解释 为SIGFPE信号发
送给进程。再⽐比如当前进程访问了⾮非法内存地址,,MMU会产⽣生异常,内核 将这个异常解释为
SIGSEGV信号发送给进程。
3. ⼀一个进程调⽤用kill(2)函数可以发送信号给另⼀一个进程。 可以⽤用kill(1)命令发送信号给某个进程,kill(1)
命令也是调⽤用kill(2)函数实现的,如果不明确指定信号则发送SIGTERM信号,该信号的默认处理动作
是终⽌止进程。 当内核检测到某种软件条件发⽣生时也可以通过信号通知进程,例如闹钟超时产⽣生
SIGALRM信号,向读端已关闭的管道写数据时产⽣生SIGPIPE信号。 如果不想按默认动作处理信号,
⽤用户程序可以调⽤用sigaction(2)函数告诉内核如何处理某种信号.
4. 软件条件产⽣