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的方式,镜像可以直接从 ...
随机推荐
- Why you have so few friends?
Why you have so few friends?十个原因告诉你:为什么你的朋友那么少1. You Complain A Lot 你总是抱怨 If you’re constantly compl ...
- android-exploitme(八):内存保护
如果一个手机被锁屏了,但是有个app还在后台运行,这个时候你想知道些app的信息,需要分析他的内存状态. 1. 首先运行模拟器,打开emm,使得模拟器返回锁屏状态 2. 打开ddms,下载内存文件
- WordPress主题制作教程6:常用模版标签
在wordpress中,模板标签指一些字段,比如标题,内容,作者,发布日期,评论数等等,获取静态值和循环里面经常使用. 输出模板标签一般有两种方式:the_yourtag() 输出标签值和get_th ...
- linux驱动模型<输入子系统>
在linux中提供一种输入子系统的驱动模型,其主要是实现在input.c中. 在输入子系统这套模型中,他把驱动分层分类.首先分为上下两层,上层为input.c .下层为驱动的实现,下层分为两部分,一部 ...
- swift:入门知识之枚举和结构体
枚举: swift中的枚举有些类似于类这个概念,它有自己的属性,也可以有自己的方法 枚举中的成员有原始值和实际值之分,原始值用来枚举成员的排序次序,默认从0开始 枚举出来的成员值就是实际值 可以通过t ...
- NET在SQL Server中的图片存取技术
本文总结如何在.Net WinForm和.Net WebForm(asp.net)中将图片存入SQL Server中并读取显示的方法 .1.使用asp.net将图片上传并存入SQL Server中,然 ...
- hadoop中的ssh无密码登录配置
在配置Hadoop集群分布时,要使用SSH免密码登录,假设现在有两台机器hadoop@Master(192.168.1.101),作为Master机,hadoop@Slave(192.168.1.10 ...
- code manager tools git的使用;
git的使用 一.下载及安装: 1.下载:https://github.com 2.安装: 二.常用命令: 查看.添加.提交.删除.找回,重置修改文件 git help< command> ...
- [51NOD1181]质数中的质数(质数筛法)(欧拉筛)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1181 思路:欧拉筛出所有素数和一个数的判定,找到大于n的最小质 ...
- 计算机术语install和setup的区别
作为安装程序的Setup文件是软件的开发者专门为其软件设计的.exe文件,是当前最为盛行的安装程序.在运行该Setup文件进行软件安装时,Setup除了进行复制.改名.解压和目录维护等基本安装工作外, ...