Linux下信号的简单使用
2014-09-06 00:50
260 查看
1,1个main, 包含2个while,
不要被两个while中的sleep所迷惑,这里只有main()这一个主线程(进程)在运行,程序会按照自上而下顺序执行。
遇到第1个while循环中的sleep时,本线程暂停执行,交给其它线程处理,但是因为该进程只有一个线程,所以只有静静的sleep到指定时间(1s)后,再继续暂停点处的循环,
但因为第1个while循环的条件仍然成立,所以执行的仍然是第1个while循环体。
我原来想的结果是i=1,会和i=1000交叉着打印,其实这种想法是错误的。
该程序在按下CTRL+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时,程序强行退出。
输出结果:
3,带有Signal处理函数的while例子
这个例子跟第2个例子的区别是:在两个while循环体内都设置了阻止条件,
所以在打印第1个while循环体的内容时,
如果此时遇到CTRL+C,第1个while循环体会退出,
然后执行第2个循环体,而第2个循环体的阻止条件同样成立,所以程序退出了第2个循环体,
最后再顺序执行后续代码。
不要被两个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
相关文章推荐
- Linux下,使用C/C++编写的一个简单的信号处理例程
- linux 信号的捕捉和发送函数的简单使用:sigaction()和sigqueue()
- linux 使用信号和挂起进程
- Linux下 mysql oracle 简单使用手册
- linux: 基本命令之:查看磁盘空间, netstat, wc简单使用
- Cov++在Linux下简单使用 软件覆盖率工具
- Linux学习随手记(1) find命令的最简单的使用方法
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库。
- linux使用pkg-config写简单的Makefile
- splint在linux的简单使用
- Linux curl使用简单介绍
- Linux下,使用C/C++编写一个简单的消息处理程序
- Linux操作系统下Screen命令的简单使用方法
- Linux下C语言实现的简单使用线程向FIFO里写入与读取数据的例子
- Linux下 mysql &amp; oracle 简单使用手册
- Linux下,使用C/C++编写"静态链接库"的一个简单例子
- Linux/Unix下使用rsync同步文件(简单的例子)
- Linux下触摸屏的简单使用和配置
- linux下gdb调试之简单命令使用(一)
- Linux下Socket的简单使用及最简化封装