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下信号的简单使用的更多相关文章

  1. linux下git的简单运用

    linux下git的简单运用 windows下也有git,是git公司出的bash,基本上模拟了linux下命令行.许多常用的命令和linux下操作一样.也就是说,windows下的git命令操作和l ...

  2. Linux下MySQL的简单操作

    Linux下MySQL的简单操作 更改mysql数据库root的密码 首次进入数据库是不用密码的: [root@localhost ~]# /usr/local/mysql/bin/mysql -ur ...

  3. 在Linux下写一个简单的驱动程序

    本文首先描述了一个可以实际测试运行的驱动实例,然后由此去讨论Linux下驱动模板的要素,以及Linux上应用程序到驱动的执行过程.相信这样由浅入深.由具体实例到抽象理论的描述更容易初学者入手Linux ...

  4. 【转】在Linux下写一个简单的驱动程序

    转自:https://www.cnblogs.com/amanlikethis/p/4914510.html 本文首先描述了一个可以实际测试运行的驱动实例,然后由此去讨论Linux下驱动模板的要素,以 ...

  5. linux下安装mysql简单步骤

    linux下使用yum安装mysql 1.安装 查看有没有安装过: yum list installed mysql* rpm -qa | grep mysql* 查看有没有安装包: yum list ...

  6. jmeter压测、操作数据库、分布式、 linux下运行的简单介绍

    一.jmeter压测 1.如何压测 常规性能压测:10-15分钟 稳定性测试:一周.2天等 如果想要压测10分钟,勾选永远,勾选调度器,填写600秒.也可以使用固定启动时间. 2.tps.响应时间 ( ...

  7. Linux下的MySQL简单操作(服务启动与关闭、启动与关闭、查看版本)

    小弟今天记录一下在Linux系统下面的MySQL的简单使用,如下: 服务启动与关闭 启动与关闭 查看版本 环境 Linux版本:centeros 6.6(下面演示),Ubuntu 12.04(参见文章 ...

  8. Linux下Hadoop的简单安装

    Hadoop 的安装极为简单,一共只有三步:   安装JDK 安装Hadoop 配置Hadoop     1,安装JDK       下载JDK,ftp传到linux或者linux中下载     切换 ...

  9. Linux下的sqlserver简单试用

    微软自2017年就推出了可以在linux上使用的sql-server,最近接触到了一个用sqlserver的项目,便尝试使用了一下. 下载 为了简化安装,我还是使用的docker的方式,镜像可以直接从 ...

随机推荐

  1. Why you have so few friends?

    Why you have so few friends?十个原因告诉你:为什么你的朋友那么少1. You Complain A Lot 你总是抱怨 If you’re constantly compl ...

  2. Linux基础--例行工作

    1.仅进行一次的工作排程--at at的工作情况其实是这样的: 1)先找寻/etc/at.allow这个档案,写在这个档案中的使用者才能使用at,没有在这个档案中的使用者则不能使用at(即使没有写在a ...

  3. Java-马士兵设计模式学习笔记-观察者模式-OOD线程

    一.概述 1.情景:孩子睡觉,醒后要吃东西,用java模拟此情况 2.设计:child类,Dad类,都继承Runnable,dad线程监视child线程(缺点:因为要监视,所以耗cup资源) 二.代码 ...

  4. 打印TMemo的内容到打印机

    Canvas.TextOut真是好用,Printer也实在好用: procedure PrintTStrings(Lst : TStrings) ; var I, Line : Integer; be ...

  5. CentOS中通过stat查看文件的元数据

    CentOS中可以通过stat查看文件的元数据 [baby@xiaoxiao abc]$ stat honey  File: `honey'  Size: 25         Blocks: 8   ...

  6. ES6入门之Generator函数

    Generator Generator函数是ES6提供的一种异步编程解决方案,Generator函数是一个状态机,封装了多个内部状态. 执行Generator函数会返回一个遍历器对象,也就是说,Gen ...

  7. Mtk Android编译命令

    一.输入命令: cbk@YCS:~/work/k6/alps$ ./mk help Usage: (makeMtk|mk) [options] project actions [modules] Op ...

  8. [HIHO]hihoCoder太阁最新面经算法竞赛7

    题目链接:http://hihocoder.com/contest/hihointerview12 期末完事了,终于有时间成套刷题了.这套题比较简单,难度上感觉和上一套差不多.除了最后一个题是看了讨论 ...

  9. 编程时 对 用途这个字段定义时 不要用using 这个英文

    编程时  对 用途这个字段定义时  不要用using 这个英文

  10. ElasticSearch在Azure中的集群配置和Auto-Scale

    最近在项目中ElasticSearch的使用越来越多,最新的项目中要求ES使用集群,在啥都不知道的情况下弄了两天后,终于搞定,因此写个笔记记录下. 1.首先我们需要创建一个Virtual networ ...