linux信号处理 --和信息相关的几个系统调用

一、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事件将被触发

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。