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 = ;
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
Linux下信号的简单使用的更多相关文章
- linux下git的简单运用
linux下git的简单运用 windows下也有git,是git公司出的bash,基本上模拟了linux下命令行.许多常用的命令和linux下操作一样.也就是说,windows下的git命令操作和l ...
- Linux下MySQL的简单操作
Linux下MySQL的简单操作 更改mysql数据库root的密码 首次进入数据库是不用密码的: [root@localhost ~]# /usr/local/mysql/bin/mysql -ur ...
- 在Linux下写一个简单的驱动程序
本文首先描述了一个可以实际测试运行的驱动实例,然后由此去讨论Linux下驱动模板的要素,以及Linux上应用程序到驱动的执行过程.相信这样由浅入深.由具体实例到抽象理论的描述更容易初学者入手Linux ...
- 【转】在Linux下写一个简单的驱动程序
转自:https://www.cnblogs.com/amanlikethis/p/4914510.html 本文首先描述了一个可以实际测试运行的驱动实例,然后由此去讨论Linux下驱动模板的要素,以 ...
- linux下安装mysql简单步骤
linux下使用yum安装mysql 1.安装 查看有没有安装过: yum list installed mysql* rpm -qa | grep mysql* 查看有没有安装包: yum list ...
- jmeter压测、操作数据库、分布式、 linux下运行的简单介绍
一.jmeter压测 1.如何压测 常规性能压测:10-15分钟 稳定性测试:一周.2天等 如果想要压测10分钟,勾选永远,勾选调度器,填写600秒.也可以使用固定启动时间. 2.tps.响应时间 ( ...
- Linux下的MySQL简单操作(服务启动与关闭、启动与关闭、查看版本)
小弟今天记录一下在Linux系统下面的MySQL的简单使用,如下: 服务启动与关闭 启动与关闭 查看版本 环境 Linux版本:centeros 6.6(下面演示),Ubuntu 12.04(参见文章 ...
- Linux下Hadoop的简单安装
Hadoop 的安装极为简单,一共只有三步: 安装JDK 安装Hadoop 配置Hadoop 1,安装JDK 下载JDK,ftp传到linux或者linux中下载 切换 ...
- Linux下的sqlserver简单试用
微软自2017年就推出了可以在linux上使用的sql-server,最近接触到了一个用sqlserver的项目,便尝试使用了一下. 下载 为了简化安装,我还是使用的docker的方式,镜像可以直接从 ...
随机推荐
- 快速构建自己的CentOS发行版
一.制作LTOS具体过程 光盘结构介绍 * isolinux 目录存放光盘启动时的安装界面信息 * images 目录包括了必要的启动映像文件 * CentOS 目录存放安装软件包及信息 * .dis ...
- 物联网操作系统Hello China V1.76(PC串口版)版本发布
作为向ARM平台移植的基线版本,经过三个多月的努力,Hello China V1.76终于完成并发布.相对原来发布的V1.75版本,该版本主要做了如下修改: 彻底去掉了原来版本源代码中的C++特性,采 ...
- 自绘CListCtrl类,重载虚函数DrawItem
//自绘CListCtrl类,重载虚函数DrawItem void CNewListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { // TOD ...
- QT为QLabel添加Click事件(如果我们使用组件,我们关心的是信号槽;如果我们自定义组件,我们关心的是事件)
其实就是改写了一个函数:mouseReleaseEvent,当在QLabel放开鼠标的时,就发射点击信号. #ifndef CLICKEDLABEL_H_ #define CLICKEDLABEL_H ...
- IDL---ENVI
ENVI;启动envi file=envi_pickfile();选择文件dialog,返回值就为file ENVI_OPEN_FIle,file,r_fid=fid;根据文件名打开file,并且返回 ...
- MyBatis学习总结_05_实现关联表查询
一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...
- CentOS配置SSH单向无密码访问
最近在研究一款文件系统,需要远程给客户机安装软件,且需要无SSH密码访问,另外需要远程给客户机传文件,每次输入root密码很不方便,就想到用ssh key生成公钥.私钥来验证,而避免每次就必须输入ro ...
- JSP下载txt 和 Excel两种文件
JSP下载txt 和 Excel两种文件 jsp 下载txt文件和excel文件 jsp 下载txt文件和excel文件 最近做了个用jsp下载的页面 将代码贴出来 权作记录吧 1 下载txt文件 ...
- 总结JavaScript(Iframe、window.open、window.showModalDialog)父窗口与子窗口之间的操作
一.Iframe 篇 //&&&&&&&&&&&&&&&&&&a ...
- (译) Angular运行原理揭秘 Part 1
当你用AngularJS写的应用越多, 你会越发的觉得它相当神奇. 之前我用AngularJS实现了相当多酷炫的效果, 所以我决定去看看它的源码, 我想这样也许我能知道它的原理. 下面是我从源码中找到 ...