信号是软件中断。信号提供一种异步事件的方法。
内核处理信号的三大方式:
1)忽略此信号。但是SIGKILL,SIGSTOP,不能被忽略。
2)捕捉信号。要通知内核在某种信号发生时调用一个用户函数,在用户函数中,可以执行用户希望对这种事件进行的处理。
3)执行系统默认动作。
#include
void(*signal(int signo,void(*func)(int)))(int);
在信号处理程序中,进入信号捕捉函数,此时当前信号被自动的加到进程的信号【屏蔽字中。
信号集
#include
int sigemptyset(sigset_t *set);\
int sigfillset(sigset_t *set);
int sigaddset(sigset_t *set ,int signo);
int sigdelset(sigset_t *set,int signo)
int sigismember(const sigset_t *set,int signo);
#include
sigprocmask(int how ,sigset_t *restrict set sigset_t *restrict oset);
//how(SIG_BLOCK,SIG_UNBLOCK,SIG_SETMASK)
#include
int sigaction(int signo,const struct sigaction *restrict act,struct sigaction *restrict act)//可以确定一个信号的处理方式,而无需改变它
信号处理中进行非局部转移时使用sigsetjmp,siglongjmp
#include
int sigsetjmp(sigjmp_buf env,int savemask);
void siglongjmp(sigjmp_buf env,int val);
//如果savemask非0,savemask的sigsetjmp调用以及保存了env,则siglongjmp从其中回复保存的信号屏蔽字。
10-18 节的system函数部分有这样一个例子,在休眠期间如果产生了推出信号,那么此时信号是未决的,但是不是阻塞的,所以在sigprocmask返回之前,它被递送到调用进程
在原子操作中先恢复信号屏蔽字,然后使进程休眠,sigsuspend
int suspend(const sigset_t *sigmask);//如果在等待信号的期间希望调用其他系统函数,会怎样呢,不幸的是在单线程环境下对此问题没有妥善解决方法,如果可以使用多线程,则可安排一个线程处理信号。(12.8节)
阅读(548) | 评论(0) | 转发(0) |