一、概要
详细介绍:http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index1.html
信号是UNIX和Linux系统响应结条件而产生的一个事件。接收到信号的进程会相应地采取一些行动。
(1) 在系统终端下输入命名: kill -l 或 trap -l 可以查看系统所支持的信号!
(2) 信号编号1-32 是早期的信号,是不可靠信号,信号在一定条件下会丢失;
(3) 信号编号33以上是后期版系统本出现的,是可靠信号。信号生成时,进程响应还未结束,将自动排队等待响应。
(4) 信号 9 SIGKILL 和 信号 19 SIGSTOP 这两个信号不可以被捕获或忽略。
二、 函数介绍:
头文件: signal.h
1. 信号集处理:
sigfillset(sigset_t *set); 设置所有的信号到set信号集中;
sigemptyset(sigset_t *set); 从set信号集中清空所有信号;
sigaddset(sigset_t *set,int sig);在set信号集中加入sig信号;
sigdelset(sigset_t *set,int sig);在set信号集中删除sig信号;
2. 信号处理函数
(1)传统的信号处理接口: void (*signal(int sig, void (*func)(int )))(int),
因为可靠信号的出现重新规范了健壮的信号接口:int sigaction(int sig,const struct sigaction *act,struct sigaction *oldact);
关于结构体 struct sigaction ,查询 man 手册;
struct sigaction 成员:
sa_hanlder 和 sa_sigaction 指向信号处理函数的指针,只能定义其中一个,两个都定义的话,将执行sa_handler指向的函数;其中可以指向宏定义 SIG_IGN(忽略信号) 和 SIG_DFL(信号默认行为);
sa_mask 指定的是阻塞信号集,定义信号处理函数时,不被阻塞信号集中的信号打断。信号处理时如果信号未加入阻塞信号集中,将打断在执行的信号处理。
3.发送信号函数
(1) int raise(int sig); 对当前进程发送指定信号
(2) int pause(void); 将进程挂起等待信号
(3) int kill(pid_t pid,int sig); 通过进程编号发送信号
(4) unsigned int alarm(unsigned int seconds); 指定时间(秒)发送SIGALRM信号。 seconds 为0 时取消所有已设置的alarm请求;
(5)int sigqueue(pid_t pid,int sig,const union sigval val);类似于kill函数,多了附带共用体 union sigval形数,将共用体中的成员 int sival_int 或 void *sival_ptr 的值传递给 信号处理函数中的定义类型 siginfo_t 中的 int si_int 或 void *si_ptr;
(6)int setitimer(int which,const struct itimerval *value,struct itimerval *oldvalue); 可定时发送信号,根据which可指定三种信号类型:SIGALRM、SIGVTALRM 和 SIGPROF;作用时间也因which值不同而不同;struct itimerval 的成员 it_interval定义间隔时间,it_value 为0时,使计时器失效;
(7) void abort(void) 将造成进程终止;除非捕获SIGABORT信号;
4.阻塞信号
int sigprocmask(int how,const sigset_t *set,sigset_t *set); 根据how值,设置阻塞信号集,或释放阻塞的信号集
int sigpending(sigset_t *set); 获取在阻塞中的所有信号;
int sigsuspend(const sigset_t *set); 类似于 pause()函数!