前言

linux下能够通过信号机制来实现程序的软中断,是一个很实用的编程方法。

我们平时在程序执行的时候按下ctrl-c、ctrl-z或者kill一个进程的时候事实上都等效于向这个进程发送了一个特定信号,当进程捕获到信号后,进程会被中断并马上跳转到信号处理函数。

默认情况下一个程序对ctrl-c发出的信号(SIGINT)的处理方式是退出进程。所以当我们按下ctrl-c的时候就能够终止一个进程的执行。

signal函数

可是有时候我们希望我们的程序在被信号终止之前运行一些特定的收尾流程。或者我们希望我们的程序在收到特定信号后可以运行我们自定义的中断操作。在linux下我们可以通过signal函数实现上述的功能。

比如:在Linux以下写一个程序。假设程序中出现死循环的话,我们就应该在键盘上按Ctrl+C来终止我们的程序,那么我们也能够捕获这个信号,然后运行我们自己的信号处理程序,输出一些实用的信息来帮助我们调试程序,这也算是一种技巧吧。假设我们不去捕获这个信号的话。那么信号产生后就去运行OS的信号处理程序。信号和中断非常像。我们既能够使用OS的中断处理程序。也能够截获中断运行自己的中断处理程序。以下是一个多线程的样例:

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h> #define true 1 void * One(void * no)
{
while (true)
{
printf("NUAACS1\n");
sleep(1);
}
} void * Two(void * no) {
while (true)
{
printf("NUAACS2\n");
sleep(1);
}
} void Stop(int signo)
{
printf("oops! stop!!!\n");
_exit(0);
} int main()
{
int res;
pthread_t A, B; signal(SIGINT, Stop);
res = pthread_create(&A, NULL, One, NULL);
res = pthread_create(&B, NULL, Two, NULL);
res = pthread_join(A, NULL);
res = pthread_join(B, NULL); return 0;
}

以上是网上的资料,但另一点要注意的是,程序被中断并运行完中断函数后,也就是在中断函数中返回。那么程序会又一次返回到中断前的位置继续运行之前的程序。信号处理函数仅仅能返回void,不能返回指定的參数。

另外,对于有些函数。程序的中断可能会打断这些函数的正常运行。比方说对于sleep函数,假设一个程序再sleep的途中被中断那么该程序会立马结束sleep。

Linux下利用signal函数处理ctrl+c等信号的更多相关文章

  1. Linux下利用ioctl函数获取网卡信息

    linux下的ioctl函数原型如下: #include <sys/ioctl.h> int ioctl(int handle, int cmd, [int *argc, int argv ...

  2. 嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误

    嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误 2015-05-27 14:19 184人阅读 评论(0) 收藏 举报  分类: 嵌入式(928)  一般察看函数运行时堆栈的 ...

  3. 【java】 linux下利用nohup后台运行jar文件包程序

    Linux 运行jar包命令如下: 方式一: java -jar XXX.jar 特点:当前ssh窗口被锁定,可按CTRL + C打断程序运行,或直接关闭窗口,程序退出 那如何让窗口不锁定? 方式二 ...

  4. 【C/C++】Linux下使用system()函数一定要谨慎

    [C/C++]Linux下使用system()函数一定要谨慎 http://my.oschina.net/renhc/blog/53580 曾经的曾经,被system()函数折磨过,之所以这样,是因为 ...

  5. Linux下系统时间函数、DST等相关问题总结(转)

    Linux下系统时间函数.DST等相关问题总结 下面这个结构体存储了跟时区相关的位移量(offset)以及是否存在DST等信息,根据所在的时区信息,很容易找到系统时间与UTC时间之间的时区偏移,另外根 ...

  6. Linux下利用Ret2Libc绕过DEP

    Linux下利用Ret2Libc绕过DEP ⑴.  原理分析: 系统库函数通常是不受DEP(关于DEP,可以查看我之前文章的详细介绍)保护的,所以通过将返回地址指向系统函数可以绕过DEP保护,所以可以 ...

  7. linux下利用elk+redis 搭建日志分析平台教程

    linux下利用elk+redis 搭建日志分析平台教程 http://www.alliedjeep.com/18084.htm   elk 日志分析+redis数据库可以创建一个不错的日志分析平台了 ...

  8. linux下利用openssl来实现证书的颁发(详细步骤)--转载和修改

    原文地址:http://www.cnblogs.com/firtree/p/4028354.html linux下利用openssl来实现证书的颁发(详细步骤) 1.首先需要安装openssl,一个开 ...

  9. 【转】在嵌入式Linux和PC机Linux下使用popen函数时,程序运行结果有差异。

    下面程序演示了在嵌入式Linux和PC机Linux下使用popen函数时,程序的运行结果是有差异的. 两个程序 atest.c 和 btest.c,atest 检查是否有 btest 进程运行,如果没 ...

随机推荐

  1. Shell 命令行快捷键

    在shell命令终端中.Ctrl+n相当于方向向下的方向键,Ctrl+p相当于方向向上的方向键. 在命令终端中通过它们或者方向键能够实现对历史命令的高速查找.这也是高速输入命令的技巧. 在命令终端中能 ...

  2. Oracle初级索引学习总结

    前言  索引是常见的数据库对象,建立索引的目的是为了提高记录的检索速度.它的设置好坏,使用是否得当,极大地影响数据库应用程序和Database的性能.虽然有许多资料讲索引的用法,DBA和Develop ...

  3. 用FadingActionBar实现有头图的ActionBar

         FadingActionBar这个开源项目在社区上很火,感觉Google I/O 2014中就有它的身影.今天我们来介绍下这个实用的开源项目. 首先是到这里(https://github.c ...

  4. Java命令学习系列(四)——jstat

    jstat(JVM Statistics Monitoring Tool)是用于监控虚拟机各种运行状态信息的命令行工具.他可以显示本地或远程虚拟机进程中的类装载.内存.垃圾收集.JIT编译等运行数据, ...

  5. Ubuntu apt-get 彻底卸载软件包

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/get_set/article/details/51276609 如果你关注搜索到这篇文章,那么我可以 ...

  6. 如何设置浏览器禁止使用UC浏览器

    通过UA可以判断浏览器是否是UC浏览器 if(navigator.userAgent.indexOf('UCBrowser')>-1) {  alert("当前浏览器不支持本站,建议更 ...

  7. chain33 区块链开发框架诞生记

    chain33 诞生记 很多年没有写博客了,应该说,自从2013年开始玩比特币,就没有写过了.这5年来,做了很多事情,也见了很多以前做梦都没有想到过都事情.我做的最开心的事情,也是觉得最有意义的事情, ...

  8. go语言之进阶篇Ticker的使用

    Ticker是一个定时触发的计时器,它会以一个间隔(interval)往channel发送一个事件(当前时间),而channel的接收者可以以固定的时间间隔从channel中读取事件. 1.Ticke ...

  9. 转:[大数据竞赛]协同过滤在这个问题上是否work

    http://bbs.aliyun.com/read/154433.html?spm=5176.7189909.0.0.gzyohy&fpage=2 看到主办方之前发的一篇文章里提到,这个购买 ...

  10. C语言变长数组data[0]【总结】

    1.前言 今天在看代码中遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在linux内核中,结构体中经常用到data ...