sigaction()
2007年06月02日 星期六 10:59
sigaction()是POSIX的信号接口,而signal()是标准C的信号接口(如果程序必须在非POSIX系统上运行,那么就应该使用这个接口) 给信号signum设置新的信号处理函数act, 同时保留该信号原有的信号处理函数oldact ------------------------------------------------ int sigaction( int signum, const struct sigaction --*act, struct sigaction *oldact) #include <stdio.h> #include <signal.h> #include <unistd.h> 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++; } } 注: (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清零后可能会造成信号丢失! |