/*
* main.cpp
*
* Created on: Jul 5, 2014
* Author: john
*/

#include<iostream>
#include<signal.h>
#include<unistd.h>
using namespace std;
void signal_handler(int signint)
{
cout<<"get recv\n"<<endl;
}
//singal process
void my_signal_handler(int)
{
cout<<"recv SIGNQUIT\n";
sleep(5);

}
int main()
{
//处理Ctrl+C
signal(SIGINT,signal_handler);
struct sigaction act;
act.sa_handler=my_signal_handler;
act.sa_flags=SA_NOMASK;
//处理Ctrl+\
sigaction(SIGQUIT,&act,NULL);
while(1)
;
return 0;
}


signal函数仅仅能够为我们需要处理的信号决定新的处理过程,而sigaction则是可以更为细致化的处理该信号,也就是说对该信号的处理,我们可以自行定制,而不是简简单单的为其指定新的处理过程

#include<signal.h>

int signaction(int signum,const struct sigaction*act,const struct sigaction*oldact);

struct sigaction{

void (*sa_handler)(int);

void (*sa_sigaction)(int,siginfo_t*,void*);

sigset_t sa_mask;

int sa_flags;

void (*sa_restorer)(void);

}

sigaction 会根据参数signum,指定的信号,来设置该信号的处理函数,参数可以是SIGKILL  或者是SIGSTOP以外的任何信号,如果参数act不是NULL,则是signum的新的信号处理函数,如果oldact不是NULL则旧的信号处理函数则被存储在oldact当中,也就是说,通过

struct sigaction ss;

sigaction(SIGINT,NULL,&ss);我们可以获得改信号的默认处理过程

现在说下结构体sigaction,其变量sa_handler和sa_sigaction不能同时起作用,默认是sa_handler,但是如果在sa_flags在指定SA_SIGINFO时,sa_sigaction起作用

另外sa_mask声明了一个信号集,也就是说在默认情况下,如果当前信号正在处理,那么新来的同样的信号则会被丢弃,处理完成之后才能重新接受该信号,如果sa_mask设置了SA_NOMASK,则允许处理改信号之前,再次接受改信好,即信号的潜逃处理。