我是靠谱客的博主 繁荣帆布鞋,最近开发中收集的这篇文章主要介绍Linux 多个信号 捕获,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

void handler(int signo);

int main(int argc, char ** argv)
{
    sigset( SIGINT   , handler );
    sigset( SIGQUIT  , handler );
    sigset( SIGKILL  , handler );
    sigset( SIGTERM  , handler );
    signal( SIGALRM  , handler );
    signal( SIGUSR1  , handler );
    signal( SIGUSR2  , handler );
    alarm(3);//3s后发送SIGALARM信号给自己

    printf( "Process_pid=[%d]n", getpid() );
    while(1){
        int ch = getchar();
        if('z' == ch){
            kill(getpid(),SIGINT);      
        }else if('x' == ch){
            kill(getpid(),SIGQUIT);     
        }else if('c' == ch){
            kill(getpid(),SIGKILL);//按下c程序退出,因为此信号不可忽略
        }else if('v' == ch){
            raise(SIGTERM); //or kill(getpid(),SIGTERM);    
        }else if('b' == ch){
            raise(SIGUSR1);     
        }else if('n' == ch){
            raise(SIGUSR2); 
        }else if('m' == ch){
            raise(SIGALRM); 
        }   
    }
    return 0;
}

void handler(int signo)
{
    switch(signo) {
    case SIGINT: //处理信号 SIGINT
        printf("SIGINT received...n");
    break;
    case SIGQUIT: //处理信号 SIGINT
        printf("SIGINT received...n");
    break;
    case SIGKILL: //处理信号 SIGKILL
        printf("SIGKILL received...n");//永远不会到此
    break;
    case SIGTERM: //处理信号 SIGTERM
        printf("SIGTERM received...n");
    break;
    case SIGUSR1: //处理信号 SIGUSR1
        signal(SIGUSR1,SIG_IGN);    //第一次输出,第二次以后因为忽略了信号,所以没有输出了
        printf("SIGUSR1 received...n");
    break;
    case SIGUSR2: //处理信号 SIGUSR2
        printf("SIGUSR2 received...n");//第一次输出,第二次因为设置了默认处理方式(退出),所以程序就退出了
        signal(SIGUSR2,SIG_DFL);        
    break;  
    case SIGALRM: //处理信号 SIGALRM
        printf("SIGALRM received...n");        
    break;
    default:     
        fprintf(stderr,"Should not be here...n");
    break;
    }
}

signal() 与sigset() 的同异
在有些版本的UNIX系统中,signal() 会在调用信号处理函数前,重设该信号的动作为系统缺省动作。如果应用程序希望在响应信号后仍然按照自己的动作处理该信号,则必须在信号处理函数的第一行中使用signal()重设该动作。
sigset()解决了signal()存在的上述问题。其余功能和特性与signal()相同。
所以尽量用sigset()。

最后

以上就是繁荣帆布鞋为你收集整理的Linux 多个信号 捕获的全部内容,希望文章能够帮你解决Linux 多个信号 捕获所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部