Linux信号—可靠信号与不可靠信号实践

检测两种信号区别,代码:

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>

void myHandle(int num)
{
    /*首先解除信号阻塞*/
    if(num == SIGUSR1){
        sigset_t bset;
        sigemptyset(&bset);
        sigaddset(&bset, SIGINT);
        sigaddset(&bset, SIGRTMIN);

        sigprocmask(SIG_UNBLOCK, &bset, NULL);
    }else{
        printf("received signal is %d\n", num);
    }
}

/*注册信号 函数*/
void sign_signal(struct sigaction *act)
{
    //注册非实时信号处理函数
    if(sigaction(SIGINT, act, NULL) < 0){
        perror("sigaction failed\n");
        exit(0);
    }

    //注册实时信号 处理函数
    if(sigaction(SIGRTMIN, act, NULL) < 0){
        perror("sigaction failed\n");
        exit(0);
    }

    //注册用户自定义信号 处理函数
    if(sigaction(SIGUSR1, act, NULL) < 0){
        perror("sigaction failed\n");
        exit(0);
    }
}

int main(int argc, char *argv[])
{
    printf("start now..\n");
    int i;
    pid_t pid;

    /*注册信号*/
    struct sigaction act;
    act.sa_handler = myHandle;
    act.sa_flags = SA_SIGINFO;
    sign_signal(&act);

    /*把SIGINT和SIGRTMIN均添加到本进程的阻塞状态字中*/
    sigset_t bset;
    sigemptyset(&bset);
    sigaddset(&bset, SIGINT);
    sigaddset(&bset, SIGRTMIN);
    sigprocmask(SIG_BLOCK, &bset, NULL);

    //创建父子进程
    pid = fork();
    if(pid == -1){
        perror("fork failed\n");
        exit(0);
    }

    /*子进程*/
    if(pid == 0)
    {
        int ret;
        union sigval v;
        v.sival_int = 110;

        /*发5次不可靠(非实时)信号*/
        for(i = 0; i < 5; i++){
            ret = sigqueue(getppid(), SIGINT, v);
            if(ret != 0){
                perror("SIGINT sigqueue failed\n");
                exit(0);
            }
            printf("SIGINT 发送成功!\n");
        }

        //发5次可靠(实时)信号
        for(i = 0; i < 5; i++){
            ret = sigqueue(getppid(), SIGRTMIN, v);
            if(ret != 0){
                perror("SIGTRMIN sigqueue failed\n");
                exit(0);
            }
            printf("SIGRTMIN 发送成功!\n");
        }

        /*待信号SIGINT、SIGRTMIN各5次发送完毕后,解除信号阻塞*/
        kill(getppid(), SIGUSR1);
    }

    /*父进程*/
    while(1)
    {
    }
}

执行结果

/*
start now..
SIGINT 发送成功!
SIGINT 发送成功!
SIGINT 发送成功!
SIGINT 发送成功!
SIGINT 发送成功!
SIGRTMIN 发送成功!
SIGRTMIN 发送成功!
SIGRTMIN 发送成功!
SIGRTMIN 发送成功!
SIGRTMIN 发送成功!
received signal is 34
received signal is 34
received signal is 34
received signal is 34
received signal is 34
received signal is 2

*///按ctrl + \退出

你可能感兴趣的:(Linux信号—可靠信号与不可靠信号实践)