一、sigaction函数
#include <signal.h>
int sigaction(int sig,const struct sigaction* act,strcut sigaction* oact);
sig参数指出要捕获的信号类型,act参数指定新的信号处理方式,oact参数则输出信号先前的处理方式(如果不为NULL的话),act和oact都是sigaction结构体类型的指针
信号集函数
#include <signal.h>
int sigemptyset(sigset_t* _set)
int sigfillset(sigset_t* _set)
int sigaddset(sigset_t* _set,int signo)
int sigdelset(sigset_t* _set,int signo)
int sigismember(const siggset_t* set,int signo)
进程信号掩码
指定进程的信号掩码,这样这样的信号就不能发送给本进程
int sigprocmask(int _how,const sigset_t* set,sigset_t* oset);
how参数的类型
SIG_BLOC 新的进程掩码是其当前值和_set指定信号集的并集
SOG_UNBLOCK 新的进程信号掩码是其当前值和~_set信号集的交集,因此_set指定的信号集将不被屏蔽
SIG_SETMASK 直接将进程掩码设置为_set
被挂起的信号
设置进程信号掩码后,被屏蔽的信号将不能被进程接受,如果给进程发送一个被屏蔽的信号,则操作系统将该信号设置为进程的一个被挂起的信号,如果我们取消对该信号的屏蔽,则它能立即被进程接收到,如下函数可以获得进程当前被挂起的信号集
int sigpending(sigset_t* set);
进程即使多次接收到同一个被挂起的信号,sigpending函数也只能反映一次,并且当我们再次使用sigprocmask使能该挂起的信号时,该信号的处理函数也只被触发一次。
几个特殊的和网络编程有关的信号:
SIGHUP:
当挂起进程的控制终端时,SIGHUP信号被触发,对于没有控制终端的网络后台程序而言,他们通常利用SIGHUP信号来强制服务器重读配置文件
SIGPIPE
默认情况下,往一个读端关闭的管道或socket连接中写数据将引发SIGPIPE信号,SIGPIPE默认欣慰是结束进程,需要修改这样的默认行为。
我们也可以利用I/O复用系统调用来检测管道和socket连接的读端是否已经关闭。以poll为例子,当管道的读端关闭时,写端文件描述符上的POLLHUP事件将被触发,当socket连接被对方关闭时,socket上的POLLRDHUP事件将被触发