author:Sun
--------------------------------------------------------------------------------------------------
1.信号的处理:
1).忽略此信号。但有两种信号不能忽略:SIGKILL SIGSTOP
2).捕捉信号。捕捉到SIGCHLD信号,表示一个子进程已经终止,所以此信号的捕捉函数可调用waitpid以取得该子进程的进程ID以及它的终止状态。不能捕捉SIGKILL和SIGSTOP信号
3).执行系统默认动作
2.注册:更改系统默认中断操作
sighandler_t signal(int signum, sighandler_t handler); 返回值不时error即成功
signum是整数,第二个参数是函数指针,所指向的函数需要一个整型参数,无返回值。signal返回一个函数指针,该函数有一个整形参数。 typedef void(*sighandler_t)(int)
也就是说signal的第二个参数指向该函数(信号处理程序)的指针,返回值指向之前的信号处理程序的指针。
3.kill和raise函数
int kill(pid_t pid, int sig); 将信号发送给进程或者进程组
int raise(int sig); 给自身发送信号
若成功返回0,出错返回-1。
4.alarm和pause函数
unsigned int alarm(unsigned int seconds);设置一个计时器 返回0或闹钟时间的余留秒数
seconds是秒数,经过指定秒数产生信号SIGALRM,信号由内核产生。每个进程只有一个闹钟,可多次调用,新的闹钟会覆盖旧的闹钟,余留值作为本次函数调用值返回。若想捕捉SIGALRM信号,则必须在调用alarm之前设置该信号的处理程序。否则先调用alarm,然后再SIGALRM处理程序之前已接受到该信号,那么进程将终止。
int pause(void); 调用进程挂起直至捕捉到一个信号。只有执行了一个信号处理程序并返回,pause才返回。
5.设置sigprocmask函数:调用此函数可检测或更改信号屏蔽字
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
how:SIG_BLOCK 阻塞信号 SIG_UNBLOCK解除阻塞的信号 SIG_SETMASK 用当前值覆盖旧的值
6.sigpending函数
int sigpending(sigset_t *set); 返回信号集。各个信号对于调用进程是阻塞的
7.sigsuspend函数
int sigsuspend(const sigset_t *mask);临时替换当前信号的屏蔽字
mask传屏蔽字地址,遇到屏蔽字替换。在捕捉到一个信号或发生了一个会终止该进程的信号之前,进程处于挂起状态。返回时,进程的信号屏蔽字设置为调用前的值。
8.sigaction函数
int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);
signum是要修改或检测动作的信号编号。act非空则修改其动作,oldact非空,系统经由act指针返回该信号的上一个动作