sigaction
-------------------------------------------------------------------------------
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清零后可能会造成 |
|