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

来源:互联网 发布:开元盛世公元网络会所 编辑:程序博客网 时间:2024/04/28 02:36

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

SIGURG

 在linux环境下,内核通知应用程序带外数据到达主要有两种方法:一种是I/O复用技术,select等系统调用在接收到带外数据时将返回,并向应用程序报告socke上的异常事件,另一种方法就是SIGURG信号

1 0
原创粉丝点击