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\n",i++);
                sleep(1);
        }

        int j = 1000;
        while(j)
        {
                printf("j=%d\n",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\n");
        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\n",i++);

                if(g_sigID==100)
                {
                        break;
                }

                sleep(1);
        }

        int j = 1000;
        while(j)
        {
                printf("j=%d\n",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\n");
        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\n",i++);

                if(g_sigID==100) break;
                sleep(1);
        }

        int j = 1000;
        while(j)
        {
                printf("j=%d\n",j++);
                if(g_sigID==100) break;
                sleep(1);
        }

        printf("mainapp exit\n");
        return 0;
}

 

[root@localhost test]# ./a.out 
i=1
i=2
i=3
^C[singal]: catched ctrl+c
i=4
j=1000
mainapp exit

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。