深入理解计算机操作系统——第8章:信号
信号:
(1)软件形式的异常,称为unix信号,它允许进程中断其它进程。
(2)一个信号就是一条小消息,他通知进程系统中发生了某种类型的事件。
(3)某种信号类型都对应着某种系统事件。
8.5.1 信号术语
发送信号:内核通过更新目的进程的上下文中的某个状态,发送一个信号给目的进程。
有两个原因:
(1)内核检测到一个系统事件(比如除零错误)
(2)一个进程调用了kill函数显式的要求系统内核给目的进程发送一个信号,进程可以要求给自己发送信号。
接收信号:当目的进程被内核强迫以某种方式对信号的发送做出反应时,目的进程就接受了信号。
进程可以忽略这个信号,也可以终止或者执行一个称为信号处理程序的用户层函数来捕捉这个信号。
(1)待处理信号:一个发出而没被接收的信号。
(2)一种类型的信号至多只会有一个待处理信号。
(3)一个进程可以有选择性的阻塞某种信号,当一种信号被阻塞时,它仍可以被发送,但是待处理信号不会被接收
(4)一个待处理信号最多只能被接收一次。
8.5.2 发送信号
1. 进程组
每个进程都属于一个进程组。
默认的一个进程和他的子进程属于同一个进程组。
(1)getpgrp函数 返回当前的进程组的ID
pid_t getpgrp(void)
(2)setpgid函数 改变进程的进程组ID
int setpgid(pid_t pid ,pid_t gpid) 成功返回0,否则-1
2. 用/bin/kill程序发送信号
可以用这个程序来向另外的进程(后面id正值)或进程组(后面的id负值)大发送信号
3. 从键盘发送信号
(1)在任何时候至多只有一个前台作业,可以有0个或者多个后台作业
(2)ctrl+c 终止 ctrl+z:挂起(停止)
4. 用kill函数发送信号
进程用kill函数发送信号给其他进程包括自己
int kill(pid_t pid,int sig)
pid为目的进程的id,sig为发送的信号的类型
5.用alarm函数发送信号
unsigned int alarm(unsigned int secs)
这个函数安排内核在secs秒内给这个调用进程发送一个SIGALRM信号。
8.5.3 接收信号
typedef void (*sighandler_t)(int); 这里sighandler_t为一个指向参数为int返回值为void的函数指针
sighandler_t signal(int signum,sighandle_t handler);
第一个参数为信号类型,第二个参数为信号处理函数指针(也可以是函数名都一样)
(1)如果handler为SIG_IGN,则忽略类型为signum的信号
(2)如果handler为SIG_DFL,则信号为默认类型
(3)否则,handler就是用户定义的函数地址。
8.5.4 信号处理问题
详细的笔记在书本《深入立即计算机操作系统》上
8.5.5 可移植的信号处理
详细笔记在书本上《深入立即计算机操作系统》上