参考
http://kenby.iteye.com/blog/1173862
信号是UNIX和LINUX系统响应某些条件而产生的一个事件,接受到该信号的进程会采取相应的行动。
信号由某些错误条件而生成的,如内存段冲突,浮点处理器错误和非法指令,由shell和终端处理器生成来引起中断,它们还可以作为在进程传递消息或修改行为的方式,明确的由一个进程传递给另一个进程。信号可以被生成,捕获,响应或忽略(对于某些信号)。
信号的名称在头文件signal.h以SIG开始。
ctr+c会向前台程序发送SIGINT信号,默认是终止程序。
通常给不是前台进程发送信号的方法
kill/killall -HUP pid (killall给所有进程发送信号)
处理信号函数
#include<signal.h>
void (*signal(int sig,void(* func)(int)))(int)//返回一个 void * (*func)(int) signal(int sig, void(*func)(int))
指定某个信号的处理函数,函数的声明 void (*func)(int), signal的第一个参数指定信号,第二个参数指定处理函数,可以使用SIG_IGN(忽略),SIG_DFL(默认)。当程序设置一个自己定义的信号处理函数进行捕获处理的时候,每次都换调用,代替系统原有的处理。signal捕获的信号是不可捕获的或不可忽略的时候将调用失败,errno将被设置EINVAL。
发送信号
进程可以通过调用kill给包括自己在内的进程发送信号,当调用失败的时候一般是由于权限的问题。
#include<sys/types.h>
#include<signal.h>
int kill(pid_t pid,int sig);
kill向指定的pid发送信号sig,当成功的时候返回0,失败返回负的,errno被设置为EINVAL代表信号无效,EPERM代表权限不够,ESRCH代表目标进程不存在。
#include<unistd.h>
unsiganed int alarm(unsigned int seconds);
alarm在seconds秒后发送信号SIGALRM,由于调度和处理的时间的延迟则会迟发,seconds设置为0则取消原先所有的alarm,在alarm的等待时间中重新调用alarm则重新开始计时,每一个进程只能有一个闹钟时间,返回值返回的是以前剩余的秒数,失败返回-1.
#include<unistd.h>
int pause(void)
进程被挂起等待信号到来。
健壮的信号接口
#include<signal.h>
int sigaction(int sig,const struct sigaction *act, struct sigaction *oact)
sigaction包括以下成员
void (*)(int) sa_handler /*function, SIG_DFL,SIG_IGN
sigset_t sa_mask /*signals to block in sa_handler
int sa_flags /*signal action modifiers
sa_mask成员指定一个信号集,在调用sa_handler所指向的信号函数之前,该信号集将被加入到进程的信号屏蔽字中,这是一组将被阻塞且不会传递给进程的信号。设置信号屏蔽字可以防止看到信号在它的处理函数还未运行结束时就接收到的情况。
sigaction函数设置的信号处理函数在默认情况下不被重置的,如果进行重置,就必须在sa_falgs成员中包含值SA_RESETAND.