Chinaunix首页 | 论坛 | 博客
  • 博客访问: 61033
  • 博文数量: 26
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 255
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-18 10:40
文章分类

全部博文(26)

文章存档

2013年(26)

我的朋友

分类: LINUX

2013-10-08 15:53:42


信号是软件中断。信号提供一种异步事件的方法。
内核处理信号的三大方式:
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节)
阅读(519) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~