第八章的内容为p537~p586, 分2部分, p537~p562, p563~p586. 本文为第2部分.
摘要
这章看的很乱, 先记录下.
信号
软件形式的异常, 称为Linux信号, 允许进程和内核中断其他进程.
如果一个进程除0, 内核就给它发送一个SIGFPE信号; 如果一个进程执行一条非法指令, 内核就给它发送一个SIGILL信号.
信号术语
传送一个信号由2个部分组成, 发送信号和接收信号.
发送信号
: 内核通过更新进程上下文中的某个状态, 发送一个信号给进程.
接收信号
: 当目的进程被内核强迫以某种方式对信号的发送做出反应时, 它就接收了信号. 进程可以忽略这个信号, 或者执行信号处理程序捕获这个信号.
任何时刻, 一种类型至多只会有一个待处理信号. 一个待处理信号最多只能被接收一次. 内核为每个进程在pengding位向量中维护着待处理信号的集合, 只要传送了一个类型为k的信号, 内核就会设置pengding中的第k位, 而只要接收了一个类型为k的信号, 内核就会清除第k位.
发送信号
#include <unistd.h>
pid_t getpgrp(void); //返回调用进程的进程组ID
int setpgid(pid_t pid, pid_t pgid);//设置进程组ID, 成功返回0, 否则返回-1
/bin/kill -9 15213 //给进程15213发送信号9(SIGKILL)
Ctrl+C会导致内核发送一个SIGINT(终止)信号到前台进程组的每个进程组.
Ctrl+Z会发送一i个SIGTSTP(挂起)信号到前台进程组的每个进程.
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);//进程通过调用kill函数发送信号给其它进程(包括自己). 成功返回0, 失败返回-1
#include <unistd.h>
unsigned int alarm(unsigned int secs);//定时处理程序
接收信号
当内核把进程p从内核模式切换到用户模式时, 它会检查进程p的未被阻塞的待处理信号的集合(pending & ~blocked), 如果这个集合为空, 则执行下一条指令(I_{next}). 如果集合非空, 内核选择集合中的某个信号k(通常最小的k), 强制p接收信号k, 完成k后再继续执行指令(I_{next}).
每个信号类型都有一个预定义的默认行为, 进程终止, 进程终止并转储内存, 进程停止(挂起)直到被SIGCONT信号重启, 进程忽略该信号.
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, ,sighandler_t handler);//设置信号处理函数handler
后面的先跳过了...