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

来源:互联网 发布:阿里云服务器图形界面 编辑:程序博客网 时间:2024/04/16 15:01

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

#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 34received signal is 34received signal is 34received signal is 34received signal is 34received signal is 2*///按ctrl + \退出
0 0