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. VS编译的QT程序发布时产生的AppCrash问题

    至少我碰到了三个情况,都是AppCrash错误(以下都指VS2008的Release的设置) 第1个错误,报错模块是程序自己 我使用VS2008 Team with SP1和QT4.86编译程序,一直 ...

  2. dojo新建widget步骤----主要针对widget路径

    一,新建目录 二,新建文件 三,写urtil widget代码 四,写RedTextDialog代码 五,写HTML代码 =====================如有不懂,结合http://blog ...

  3. Jenkins Master/Slave架构

    原文:http://www.cnblogs.com/itech/archive/2011/11/11/2245849.html 一 Jenkins Master/Slave架构 Master/Slav ...

  4. CentOS 7快速搭建Nodejs开发环境

    Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好.学习Nodejs首先需要会安装环境.这里我介绍如 ...

  5. oracle11g手工建库步骤

    平台:Linux AS release 5,Oracle11.1.0.7db_name = SBDB 1. 设置环境变量export ORACLE_BASE=/opt/oracleexport ORA ...

  6. 整合Struts2+SiteMesh+Spring+MyFaces(JSF)+Freemarker的时候启动服务器报错ClassNotFoundException: org.apache.struts2.sitemesh.FreeMarkerPageFilter

    我一琢磨,难道freemarker与struts2的整合也需要添加一个struts2-freemarker-plugin的jar包? 后来找了半天,确认不需要这个. 然后我就上网搜,这个FreeMar ...

  7. 编译android出错

    注意:frameworks/base/nfc-extras/java/com/android/nfc_extras/NfcAdapterExtras.java 使用了未经检查或不安全的操作.注意:要了 ...

  8. itnesse实现api接口自动化测试学习

    上午在园子里乱逛,看了不少小伙伴们分享的接口测试方面的知识,大家所叙述到的一些经验或多或少,我也曾遇到过,突然意识到知识的点滴积累是多么的重要,我记得我最早接触接口测试的时候,就是只在浏览器里人工测试 ...

  9. NDK(4)"Unresolved inclusion jni.h”的解决方法

    参考 :  http://blog.csdn.net/zhubin215130/article/details/39347873 3种解决办法: 一,重新初始化eclipse对该project的nat ...

  10. [HIHO1223]不等式(离散化,枚举)

    题目链接:http://hihocoder.com/problemset/problem/1223 这题不难,难点在于小数的处理.可以0.5为步长枚举,也可以扩大偶数倍枚举. /* ━━━━━┒ギリギ ...