zoukankan      html  css  js  c++  java
  • Linux下信号的简单使用

    1,1个main, 包含2个while, 

    不要被两个while中的sleep所迷惑,这里只有main()这一个主线程(进程)在运行,程序会按照自上而下顺序执行。

    遇到第1个while循环中的sleep时,本线程暂停执行,交给其它线程处理,但是因为该进程只有一个线程,所以只有静静的sleep到指定时间(1s)后,再继续暂停点处的循环,

    但因为第1个while循环的条件仍然成立,所以执行的仍然是第1个while循环体。

    我原来想的结果是i=1,会和i=1000交叉着打印,其实这种想法是错误的。

    该程序在按下CTRL+C时,会直接退出。

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <iostream>
    #include <signal.h>
    using namespace std;
    
    int main()
    {
            int i = 1;
            while(i)
            {
                    printf("i=%d
    ",i++);
                    sleep(1);
            }
    
            int j = 1000;
            while(j)
            {
                    printf("j=%d
    ",j++);
                    sleep(1);
            }
    
            return 0;
    }

    输出结果:

    [root@localhost test]# ./a.out 
    i=1
    i=2
    i=3
    i=4
    i=5
    i=6
    i=7
    i=8
    ^C

    2,带有Signal处理函数的while例子

    该例子中仍有2个while循环,处理signal的断点放在了第1个while循环体内。

    因为加了Signal处理函数,此时程序会响应CTRL+C,下面分析一下:

    程序开始执行第1个while循环体,打印1,2,3,,

    如遇到CTRL+C,响应中断(打印catch语句并置g_sigID),然后回到循环体,g_sigID条件成立,退出第1个while循环。

    然后执行第2个while循环体,打印1000,1001,,

    这时如遇到CTRL+C,仍然无法阻挡第2个循环继续下去的脚步,因为这个while里面没有设置阻止条件,不像第1个while那样,在循环体内对g_SigID做判断做为阻止条件。

    而且我们自定义的对CTRL+C信号的操作,所以程序也不会退出,

    直到遇到CTRL+Z时,程序强行退出。

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <iostream>
    #include <signal.h>
    using namespace std;
    
    int g_sigID;
    void handle_sigint(int)
    {
            printf("[singal]: catched ctrl+c
    ");
            g_sigID = 100;
    }
    
    int main()
    {
            //signal(SIGINT, handle_sigint);
            struct sigaction sigHdl;
            sigHdl.sa_handler = handle_sigint;
            sigemptyset(&sigHdl.sa_mask);
            sigHdl.sa_flags = 0;
            sigaction(SIGINT, &sigHdl, NULL);
    
            int i = 1;
            while(i)
            {
                    printf("i=%d
    ",i++);
    
                    if(g_sigID==100)
                    {
                            break;
                    }
    
                    sleep(1);
            }
    
            int j = 1000;
            while(j)
            {
                    printf("j=%d
    ",j++);
                    sleep(1);
            }
    
            return 0;
    }

    输出结果:

    [root@localhost test]# ./a.out 
    i=1
    i=2
    i=3
    i=4
    ^C[singal]: catched ctrl+c
    i=5
    j=1000
    j=1001
    j=1002
    ^C[singal]: catched ctrl+c
    j=1003
    j=1004
    ^Z
    [3]+  Stopped                 ./a.out

    3,带有Signal处理函数的while例子

      这个例子跟第2个例子的区别是:在两个while循环体内都设置了阻止条件,

    所以在打印第1个while循环体的内容时,

    如果此时遇到CTRL+C,第1个while循环体会退出,

    然后执行第2个循环体,而第2个循环体的阻止条件同样成立,所以程序退出了第2个循环体,

    最后再顺序执行后续代码。

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <iostream>
    #include <signal.h>
    using namespace std;
    
    int g_sigID;
    void handle_sigint(int)
    {
            printf("[singal]: catched ctrl+c
    ");
            g_sigID = 100;
    }
    
    int main()
    {
            //signal(SIGINT, handle_sigint);
            struct sigaction sigHdl;
            sigHdl.sa_handler = handle_sigint;
            sigemptyset(&sigHdl.sa_mask);
            sigHdl.sa_flags = 0;
            sigaction(SIGINT, &sigHdl, NULL);
    
            int i = 1;
            while(i)
            {
                    printf("i=%d
    ",i++);
    
                    if(g_sigID==100) break;
                    sleep(1);
            }
    
            int j = 1000;
            while(j)
            {
                    printf("j=%d
    ",j++);
                    if(g_sigID==100) break;
                    sleep(1);
            }
    
            printf("mainapp exit
    ");
            return 0;
    }
    [root@localhost test]# ./a.out 
    i=1
    i=2
    i=3
    ^C[singal]: catched ctrl+c
    i=4
    j=1000
    mainapp exit
  • 相关阅读:
    nginx使用https协议
    DUBBO入门
    Zookeeper学习笔记4
    maven dependency:tree中反斜杠的含义
    CATALINA_BASE与CATALINA_HOME的区别
    log4j打印抛出异常时堆栈内容
    如何获取e.printStackTrace()的内容
    springboot+RabbitMQ 问题 RabbitListener 动态队列名称:Attribute value must be constant
    详细介绍Spring Boot + RabbitMQ实现延迟队列
    springboot集成rabbitmq(实战)
  • 原文地址:https://www.cnblogs.com/jacklikedogs/p/3958929.html
Copyright © 2011-2022 走看看