signal.h
传入的形参第一个便是signum,那么linux系统中到底有哪些信号量呢?总共有多少?这些如何进行分类的?linux信号总共就两种,可靠信号与不可靠信号,也可以说实时信号与非实时信号。区别在于一个讲究实时性,表现在于来多少发送多少,不排队,可能发送N次,进程只接收到一次,这样的信号值小于SIGRTMIN。另外一个恰好相反,信号支持排队,不会丢失,发多少,接收多少,信号值位于[SIGRTMIN,SIGRTMAX]之间,而且在这个区间可以被用户使用,但是你使用最好用SIGRTMIN+N形式来使用。另外可以在终端上输入kill-l来查看系统支持的所有信号。总结一句就是,可靠信号可以让用户自定义使用,非可靠信号常规都有确定的用途和含义。那么我们的第一个参数知道怎么设置了,既可以采用系统的非可靠信号,也可以自定义一个非实时的可靠信号。
关于传入的第二个参数sigaction * action。这个是一个sigaction的指针,大家肯定看到这里很疑惑为什么sigaction一个函数又来个指针,难不成函数指针,也不对啊。是这样的sigaction在这里是一个struct结构,struct sigaction {void (*sa_handler)(int);sigset_t sa_mask;int sa_flags;void (*sa_restorer) (void);}其中查询手册上看到sa_handler此参数和signal()参数的hander相同,代表新的信号处理函数sa_mask用来设置在处理该信号时不管sa_mask指定的信号sa_flags 用来设置信号处理的其他相关操作oldact有用那么就讲oldact作为原有的信号处理方式返回对于sigaction有了解后,我么就知道怎么来形成这个参数了,我们首先定义一个sigaction act,设置act->sa_handler=funct;也就是我们希望处理信号希望调用的funct函数。同理oldact一样这样声明定义得到。
现在int sigaction(int signum,const struct sigaction *action,struct sigaction * oldact)函数的参数含义我们已经明确,并且已经初始化好,那么我们可以比如说希望对自己定义的信号量进行自定义的funct的处理,我们就可以这样写:struct sigaction act,oldact;act.sa_handler=funct;sigaction(SIGMEUSER,&act,NULL)这样针对SIGMEUSER信号处理会调用funct函数。我们可以在这个进程中针对信号量A执行特定的处理函数,在另外一个进程中使用kill(pid_t pid,int sig)来将sig传送到第一个进程中这样就可以跨进程触发那个函数执行了。要走的路还很长可以多尝试。
struct sigaction的初始化
oldact的定义,非NULL时候的oldact作为原有的信号处理方式返回