Linux下信号的简单使用

时间:2021-08-09 07:18:00

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

输出结果:

[root@localhost test]# ./a.out
i=
i=
i=
i=
i=
i=
i=
i=
^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 = ;
} int main()
{
//signal(SIGINT, handle_sigint);
struct sigaction sigHdl;
sigHdl.sa_handler = handle_sigint;
sigemptyset(&sigHdl.sa_mask);
sigHdl.sa_flags = ;
sigaction(SIGINT, &sigHdl, NULL); int i = ;
while(i)
{
printf("i=%d\n",i++); if(g_sigID==)
{
break;
} sleep();
} int j = ;
while(j)
{
printf("j=%d\n",j++);
sleep();
} return ;
}

输出结果:

[root@localhost test]# ./a.out
i=
i=
i=
i=
^C[singal]: catched ctrl+c
i=
j=
j=
j=
^C[singal]: catched ctrl+c
j=
j=
^Z
[]+ 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 = ;
} int main()
{
//signal(SIGINT, handle_sigint);
struct sigaction sigHdl;
sigHdl.sa_handler = handle_sigint;
sigemptyset(&sigHdl.sa_mask);
sigHdl.sa_flags = ;
sigaction(SIGINT, &sigHdl, NULL); int i = ;
while(i)
{
printf("i=%d\n",i++); if(g_sigID==) break;
sleep();
} int j = ;
while(j)
{
printf("j=%d\n",j++);
if(g_sigID==) break;
sleep();
} printf("mainapp exit\n");
return ;
}
[root@localhost test]# ./a.out
i=
i=
i=
^C[singal]: catched ctrl+c
i=
j=
mainapp exit