重庆时时彩三星走势图:sigaction函数

来源:百度文库 编辑:中财网 时间:2024/05/12 04:45:13

sigaction

sigaction()是POSIX的信号接口,而signal()是标准C的信号接口(如果程序必须在非POSIX系统上运行,那么就应该使用这个接口)

给信号signum设置新的信号处理函数act, 同时保留该信号原有的信号处理函数oldact
------------------------------------------------
int sigaction( int signum,
const struct
sigaction --*act,
struct sigaction *oldact)


#include #include #include
void show_handler(int sig)
{
printf("I got signal %d\n", sig);
int i;
for(i = 0; i < 5; i++) {
printf("i = %d\n", i);
sleep(1);
}
}

int main(void)
{
int i = 0;
struct sigaction act, oldact;
act.sa_handler = show_handler;
sigaddset(&act.sa_mask, SIGQUIT); //(1)
act.sa_flags = SA_RESETHAND | SA_NODEFER; //(2)
//act.sa_flags = 0; //(3)

sigaction(SIGINT, &act, &oldact);
while(1) {
sleep(1);
printf("sleeping %d\n", i);
i++;
}
}

-------------------------------------------------------------------------------
struct sigaction{
void (*sa_handler)(int);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
}
sa_handler就是中断处理程序入口,sa_mask表示中断处理中要屏蔽的中断,sa_flags的标志位:

SA_NOCLDSTOP:如果所处理的中断是SIGCHLD,由于收到其他信号而导致子进程终止,将不发出SIG_CHLD

SA_ONESHOT or SA_RESETHAND:sa_handler所指定的中断处理程序只执行一次,之后将置为没人的中断处理程序

SA_RESTART:让被中断的系统调用在中断返回后重新执行

SA_NOMASK or SA_NODEFER:在中断处理程序执行时,不屏蔽自己的中断信号

使用举例:

struct sigaction alrmact;

memset(&alrmact,0,sizeof(struct sigaction));

alrmact.sa_handler=do_nothing;

alrmact.sa_flags=SA_NOMASK;

alrmact.sa_restorer=NULL;

sigaction(SIGALAM,&alrmact,NULL);

注:
(1) 如果在信号SIGINT(Ctrl + c)的信号处理函数show_handler执行过程中,本进程收到信号SIGQUIT(Crt+\),将阻塞该信号,直到show_handler执行结束才会处理信号SIGQUIT。
(2)
SA_NODEFER 一般情况下, 当信号处理函数运行时,内核将阻塞<该给定信号 -- SIGINT<。但是如果设置了SA_NODEFER标记, 那么在该信号处理函数运行时,内核将不会阻塞该信号。 SA_NODEFER是这个标记的正式的POSIX名字(还有一个名字SA_NOMASK,为了软件的可移植性,一般不用这个名字)
SA_RESETHAND
当调用信号处理函数时,将信号的处理函数重置为缺省值。 SA_RESETHAND是这个标记的正式的POSIX名字(还有一个名字SA_ONESHOT,为了软件的可移植性,一般不用这个名字)
(3) 如果不需要重置该给定信号的处理函数为缺省值;并且不需要阻塞该给定信号(无须设置sa_flags标志),那么必须将sa_flags清零,否则运行将会产生段错误。但是sa_flags清零后可能会造成