现在的位置: 首页 > 综合 > 正文

signal()函数分析

2013年10月14日 ⁄ 综合 ⁄ 共 1704字 ⁄ 字号 评论关闭

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

sigaction()函数的功能是检查或修改与制定信号相关联的处理动作。
给信号signum设置新的信号处理函数act, 同时保留该信号原有的信号处理函数oldact

struct stgaction{

void (*sa_handler)(int);    /*addr of signal handler,or SIG_IGN,or SIG_DFL*/

sigset_t sa_mask;             /*additional signals to block*/

int    sa_flags;                    /*signal options*/

/*alternate handler */

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

};

------------------------------------------------
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)设置屏蔽QUIT
    act.sa_flags = SA_RESETHAND | SA_NODEFER; //(2)
    //act.sa_flags = 0; //(3)

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

             }

}


    执行结果:

sleeping 0
sleeping 1
sleeping 2
^/I got signal 3
i = 0
i = 1
i = 2
i = 3
i = 4
sleeping 3
sleeping 4
sleeping 5
sleeping 6
^C

注:
(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清零后可能会造成信号丢失

抱歉!评论已关闭.