signal的全集和信号handler
http://www.linpus.com.tw (2001-06-29 14:08:00)
#define SIGHUP 1
进程由於控制终端死去或者控制终端发出起命令
#define SIGINT 2
键盘中断所产生的信号
#define SIGQUIT 3
键盘终止
#define SIGILL 4
非法的指令
#define SIGTRAP 5
进程遇到一个追踪(trace)或者是一个中断嵌套
#define SIGABRT 6
由abort系统调用所产生的中断信号
#define SIGIOT 6
类似於SIGABRT
#define SIGBUS 7
进程试图使用不合理的记忆体
#define SIGFPE 8
浮点异常
#define SIGKILL 9
KILL
#define SIGUSR1 10
用户自定义
#define SIGSEGV 11
段错误
#define SIGUSR2 12
用户自定义
#define SIGPIPE 13
管道操作时没有读只写
#define SIGALRM 14
由alarm系统调用产生的timer时钟信号
#define SIGTERM 15
收到终端信号的进程
#define SIGSTKFLT 16
堆叠错误
#define SIGCHLD 17
子进程向父进程发出的子进程已经stop或者终止的信号
#define SIGCONT 18
继续运行的信号
#define SIGSTOP 19
stop
#define SIGTSTP 20
键盘所产生的stop信号
#define SIGTTIN 21
当运行在後状态时却需要读取stdin的资料
#define SIGTTOU 22
当运行在後状态时却需要写向stdout
#define SIGURG 23
socket的紧急情况
#define SIGXCPU 24
进程超额使用CPU分配的时间
#define SIGXFSZ 25
进程使用了超出系统规定文件长度的文件
#define SIGVTALRM 26
内部的alarm时钟过期
#define SIGPROF 27
在一个程式段中描绘时钟集过期
#define SIGWINCH 28
终端视窗的改变
#define SIGIO 29
非同步IO
#define SIGPOLL SIGIO
pollable事件发生
如何去册一个信号handler?
首先,用sigprocmask设置或者更改信号mask,如果信号mask没有被设置,所有的信号采用预设的
方式处理,一旦设置了mask,就使用sigaction俘获信号
int sigprocmask(int how,const sigset_t,sigset_t *oldset);
how有以下值:
SIG_BLOCK 集合中包含额外的信号需要阻塞
SIG_UNBLOCK 集合中包含额外的信号需要不阻塞
SIG_SETMASK 集合中包含新的信号mask
struct sigaction{
void (*sa_handler)(int);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
};
*sa_handler指向信号处理的函数,sa_handler的参数可以是SIG_DFL,
,启动信号处理的预设值,如果是SIG_IN,将忽略信号.
信号处理的过程中,需要使用sa_mask定义一套需要遮罩的信号
sa_flags是改变sa_handler行为的mask,它可以是以下几种:
(1)SA_NOCLDSTOP
忽略子进程发出的SIGSTOP,SIGTSTP,SIGTTIN,SIGTTAU
(2)SA_ONESHOT或者SA_RESETHAND
册的定制的信号处理仅仅被执行一次,在它被执行後,信号的缺省操作将被还原
(3)SA_RESTART
使能可重起的系统调用
(4)SA_NOMASK或者SA_NODEFER
dont prevent the signal from being recieved within its own handler
忽略sa_restorer,它无需使用
(http://www.fanqiang.com)