现在的位置: 首页 > 综合 > 正文

signal的全集和信号handler

2013年03月06日 ⁄ 综合 ⁄ 共 1677字 ⁄ 字号 评论关闭
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)

【上篇】
【下篇】

抱歉!评论已关闭.