信号基本概念
- ctrl+c产生的信号只能发给前台进程。一个命令后面加个&可以放到后台运行,这样shell不必等待进程结束就可以接受新的命令,启动新的程序
- Shell可以同时运⾏行一个前台进程和任意多个后台进程,只有前台进程才能接到像Ctrl-C这种控制键产⽣生的信号
- 前台进程在运⾏行过程中,用户随时可能按下Ctrl-C⽽而产⽣一个信号,也就是说该进程的⽤户空间代码执行到任何地⽅方都有可能收到SIGINT信号而终⽌,所以信号相对于进程的控制流程来说是异步(Asynchronous)的
用kill -l可以看到系统定义的信号列表:
1-31 普通信号 、 34-64 实时信号
部分进程默认处理信号的功能叫终止进程
信号处理常见方式: - 忽略此信号
- 执行该信号的默认处理动作(部分进程默认是终止进程)
- 自定义 提供一个信号处理函数
产生信号
- 通过终端按键产生信号:SIGINT的默认处理动作是终止进程,SIGQUIT的默认处理动作是终止进程并Core Dump(核心转储)。
- 调用系统函数向进程发信号 kill命令是调用kill函数实现的 。kill函数可以给指定的一个进程发送指定的信号。raise函数可以给当前进程发送指定的信号(自己给自己发信号)
- 由软件条件产生信号
阻塞信号
信号其他相关常见概念: - 实际执行信号的处理动作称为信号的 递达(Delivery)
- 信号从产生到递达之间的状态,称为信号未决(Pending)
- 信号可以选择阻塞(Block)某个信号
如果一个信号被Block,则一定不会被递达
如果一个信号没有被Block但被Pending 不会立即递达,会在合适的时候
在内核中的表示:
三张表都和PCB有关
每个信号都有两个标志位分别表示 block和pending,还有一个函数指针表示处理动作。SIG_DFL:默认 SIG_IGN:忽略 User Space 自定义
每个信号只有一个bit未决标志,非0即1,阻塞标志也是这样表示,所以,未决和阻塞标志可以用sigset_t来存储,sigset_t称为信号集。阻塞信号集也叫当前进程的信号屏蔽字(signal Mask)
信号捕捉
4次用户-内核切换,四个焦点上方为用户,下方为内核。
相交线的焦点代表:信号检测 当进程从内核态返回到用户时,对信号进行检测以及处理
什么叫把进程挂起?(PCB挂起) 只要不是 R,X,Z,D 挂起不能被调度,只有R状态才能被调度。 答:把进程状态设置为T状态,把进程放到等待队列里。