/*************************************************************************
	> File Name: signal.c
	> Author: 
	> Mail: 
	> Created Time: 2015年11月21日 周六 10时21分58秒
 ************************************************************************/

#include 
#include 
#include 
#include 

void sig_handler(int 努姆)
    万一(num) == SIGITT)
        收执 the SIGINT: %d\n", 努姆)
    }
    else if (num) == SIGQUIT){
        printf("recevie the SIGQUIT: %d\n", 努姆)
    }
}

int main()
{
    信号(信号), sig_handler);
    signal(SIGQUIT, sig_handler);

    出口 to the while.\n");
    (1)
        休息(1)
    }

    摆脱了责任或义务的(0)
}

        按Ctrl C发送分离信号。,那就是收回SIGITT信号。;按CTRRL \收回信号。,即发送SIGUDE信号。;
信号有或起作用是让顺序夺得设置的信号(当FIR,治理一组信号处置有或起作用(由居第二位的限制因素选定的);
运转成果如次:

        

        万一你想摆脱了责任或义务的为了顺序,按CTRL Z把持摆脱了责任或义务的,但此刻出口PS。,您可以预告正好运转的顺序并心不在焉真正摆脱了责任或义务的。,在这点上,咱们应该扼杀为了加工。;
出口:kill -9 要旨号 这么与PS.反省,你可以预告为了加工仅有的倒霉死。;

        

        例二:

        加工把持块中有64位(0~63)个知识块。,暗示信号的播放社会地位。,更确切地说,信号播放社会地位字。;每个或多或少暗示信号的播放社会地位。,
譬如,万一BIT1是1,暗示SIGIN信号被闭塞。,就是要旨收到SIGINT信号继后将不会去治理,它架了信号。,当信号设置为
SIGIT信号只在不闭塞时才被处置。;
这么咱们怎样设置这64个信号的闭塞和非闭塞的社会地位呢???内核预备了API有或起作用,
最早步:为SigStIt精确地解释变量集;
居第二位的步:变量的值被重新安装。,sigemptyset(&集中);
第三步:将要设置的信号添加到信号集。,更确切地说,设置变量。;譬如:sigaddset(&set,SIGITT)
四的步:在SET的信号播放社会地位字中报户口信号集集。;
int sigprocmask(int how, const sigset_t *set, sigset_t OSET;将信号集设置为内核。
西格布死胡同是什么时分,设置要闭塞的信号。;如今是SigyunB拦的时分了。,设置信号为非闭塞。;
SET是咱们仅有的精确地解释的信号集。,OSET可以回转要旨中间的前任何人信号播放字的社会地位。;(万一挑剔),设置为空)

        
在要旨把持块外面死气沉沉的任何人信号凸出的社会地位字,它也64位。,用于身份证明64个信号。;譬如:BIT1设置为1。,暗示已收执到SIGITEN信号。,只
信号被闭塞了。,心不在焉被处置;万一BIT1设置为0,暗示SigIt可以抵达并被处置。;

        经过有或起作用sigpending(&pending_集中);来达到要旨把持块外面的信号凸出的社会地位字的值;

        

        /*************************************************************************
	> File Name: signal.c
	> Author: 
	> Mail: 
	> Created Time: 2015年11月21日 周六 10时21分58秒
 ************************************************************************/

#include 
#include 
#include 
#include 

void sig_handler(int 努姆)
    万一(num) == SIGITT)
        收执 the SIGINT: %d\n", 努姆)
    }
    else if (num) == SIGQUIT){
        printf("recevie the SIGQUIT: %d\n", 努姆)
    }
}

void print_sig_set(sigset_t * 集中)
{
    int i;

    for (i = 1; i <= 64; ++i){
        if (sigismember(set, i)){
            putchar(''1'');
        }
        else{
            putchar(''0'');
        }
    }
    printf("\n");
}

int main()
{
    
    sigset_t block_set;
    sigset_t pending_set;

    sigemptyset(&block_集中);
    sigaddset(&block_set, SIGITT)

    信号(信号), sig_handler);
    signal(SIGQUIT, sig_handler);

    sigprocmask(SIG_BLOCK, &block_set, 空)
    

    (1)
        sigpending(&pending_集中);
        print_sig_set(&pending_集中);
        休息(1)
    }

    摆脱了责任或义务的(0)
}

        

        成果是每行64个数字。,这64个数字是要旨把持块8455.com凸出的社会地位字的值;可以预告,开头,这一切都是0。,当要旨收执分离信号SIGIT时
继后,待定社会地位字的居第二位的位设置为1。,暗示信号SIGITT设置为块。;当要旨收执摆脱了责任或义务的信号SIGUDE时,,
挂起社会地位字的第三位依然是0位。;

        例三:

        据我看来收执离开信号。,重新安置SIGIN分离信号的闭塞社会地位;将sigint设置为非闭塞。;只为了设置最适当的任何人修饰块。,
譬如,可以预告以下成果。
开端时,信号挂起社会地位的值为0。,当收执到SIGIN分离时,BIT1设置为1。;当再次收执到SIGORT信号时,设置SIGIT为非闭塞。,
在这点上,该加工还显示了Sig退职和SIGITT记分的收执。,同时,凸出的社会地位的或多或少1设置为0。;当再次收执SIGIN分离时,BIT1依然设置为1。;

        

        /*************************************************************************
	> File Name: signal.c
	> Author: 
	> Mail: 
	> Created Time: 2015年11月21日 周六 10时21分58秒
 ************************************************************************/

#include 
#include 
#include 
#include 

void sig_handler(int 努姆)
    万一(num) == SIGITT)
        收执 the SIGINT: %d\n", 努姆)
    }
    else if (num) == SIGQUIT){
        printf("recevie the SIGQUIT: %d\n", 努姆)
        sigset_t new_set;
        sigaddset(&new_set, SIGITT)

        sigprocmask(SIG_UNBLOCK, &new_set, 空)
    }
}

void print_sig_set(sigset_t * 集中)
{
    int i;

    for (i = 1; i <= 64; ++i){
        if (sigismember(set, i)){
            putchar(''1'');
        }
        else{
            putchar(''0'');
        }
    }
    printf("\n");
}

int main()
{
    
    sigset_t block_set;
    sigset_t pending_set;

    sigemptyset(&block_集中);
    sigaddset(&block_set, SIGITT)

    信号(信号), sig_handler);
    signal(SIGQUIT, sig_handler);

    sigprocmask(SIG_BLOCK, &block_set, 空)
    

    (1)
        sigpending(&pending_集中);
        print_sig_set(&pending_集中);
        休息(1)
    }

    摆脱了责任或义务的(0)
}

        

        例四:

        万一据我看来重新安置SIGIN分离信号的闭塞社会地位,重新安置主效能;先例如次:

        

        /*************************************************************************
	> File Name: signal.c
	> Author: 
	> Mail: 
	> Created Time: 2015年11月21日 周六 10时21分58秒
 ************************************************************************/

#include 
#include 
#include 
#include 

void sig_handler(int 努姆)
    万一(num) == SIGITT)
        收执 the SIGINT: %d\n", 努姆)
    }
    else if (num) == SIGQUIT){
        printf("recevie the SIGQUIT: %d\n", 努姆)
        sigset_t new_set;
        sigaddset(&new_set, SIGITT)

        sigprocmask(SIG_UNBLOCK, &new_set, 空)
    }
}

void print_sig_set(sigset_t * 集中)
{
    int i;

    for (i = 1; i <= 64; ++i){
        if (sigismember(set, i)){
            putchar(''1'');
        }
        else{
            putchar(''0'');
        }
    }
    printf("\n");
}

int main()
{
    
    sigset_t block_set;
    sigset_t pending_set;

    sigemptyset(&block_集中);
    sigaddset(&block_set, SIGITT)

    信号(信号), sig_handler);
    signal(SIGQUIT, sig_handler);

    sigprocmask(SIG_BLOCK, &block_set, 空)
    
    int time = 10;
    while(time){
        sigpending(&pending_集中);
        print_sig_set(&pending_集中);
        休息(1)
        time--;
    }
    printf("first sleep is over.\n");
    
    sigprocmask(SIG_UNBLOCK, &block_set, 空)
    (1)
        sigpending(&pending_集中);
        print_sig_set(&pending_集中);
        休息(1)
    }

    摆脱了责任或义务的(0)
}

        

        从运转成果可以看出。,前十秒的情境和例三俱;当出口最早 sleep is 完毕。暗示完毕10秒。,这么将SIGIN分离信号设置为非闭塞社会地位。,
随后的成果暗示,每回分离信号被收执,它被直觉的处置。,而挑剔犹豫不决。;十秒继后的情境就和例三不俱了;

Leave a Comment

电子邮件地址不会被公开。 必填项已用*标注