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