Linux下利用signal函数处理ctrl+c等信号
前言
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等信号的更多相关文章
- Linux下利用ioctl函数获取网卡信息
linux下的ioctl函数原型如下: #include <sys/ioctl.h> int ioctl(int handle, int cmd, [int *argc, int argv ...
- 嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误
嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误 2015-05-27 14:19 184人阅读 评论(0) 收藏 举报 分类: 嵌入式(928) 一般察看函数运行时堆栈的 ...
- 【java】 linux下利用nohup后台运行jar文件包程序
Linux 运行jar包命令如下: 方式一: java -jar XXX.jar 特点:当前ssh窗口被锁定,可按CTRL + C打断程序运行,或直接关闭窗口,程序退出 那如何让窗口不锁定? 方式二 ...
- 【C/C++】Linux下使用system()函数一定要谨慎
[C/C++]Linux下使用system()函数一定要谨慎 http://my.oschina.net/renhc/blog/53580 曾经的曾经,被system()函数折磨过,之所以这样,是因为 ...
- Linux下系统时间函数、DST等相关问题总结(转)
Linux下系统时间函数.DST等相关问题总结 下面这个结构体存储了跟时区相关的位移量(offset)以及是否存在DST等信息,根据所在的时区信息,很容易找到系统时间与UTC时间之间的时区偏移,另外根 ...
- Linux下利用Ret2Libc绕过DEP
Linux下利用Ret2Libc绕过DEP ⑴. 原理分析: 系统库函数通常是不受DEP(关于DEP,可以查看我之前文章的详细介绍)保护的,所以通过将返回地址指向系统函数可以绕过DEP保护,所以可以 ...
- linux下利用elk+redis 搭建日志分析平台教程
linux下利用elk+redis 搭建日志分析平台教程 http://www.alliedjeep.com/18084.htm elk 日志分析+redis数据库可以创建一个不错的日志分析平台了 ...
- linux下利用openssl来实现证书的颁发(详细步骤)--转载和修改
原文地址:http://www.cnblogs.com/firtree/p/4028354.html linux下利用openssl来实现证书的颁发(详细步骤) 1.首先需要安装openssl,一个开 ...
- 【转】在嵌入式Linux和PC机Linux下使用popen函数时,程序运行结果有差异。
下面程序演示了在嵌入式Linux和PC机Linux下使用popen函数时,程序的运行结果是有差异的. 两个程序 atest.c 和 btest.c,atest 检查是否有 btest 进程运行,如果没 ...
随机推荐
- IP的准确性
最近游戏项目中更新机制有所修改,游戏启动时会从cdn上读取一个文件(约60B),但是后台异常收集系统中发现很多玩家请求不了该文件(libcurl的get请求),返回的error code有很多种,以6 ...
- Material Designer的低版本兼容实现(十一)—— Switch
5.0中的switch和之前完全不同了,漂亮不漂亮咱们另说,总之4.x上是没有这样的效果了.实现方式有两种,一种是用这个兼容包来做类似的效果,一种是用传统的checkbox来代替.我感觉兼容包的效果是 ...
- osx的du以字节计算
https://stackoverflow.com/questions/5794437/difference-in-size-shown-by-du-command-and-get-info-on-m ...
- C# WebBrowser控件使用整理
一.简介 WebBrowser 控件为 WebBrowser ActiveX 控件提供了托管包装. 托管包装使您可以在 Windows 窗体客户端应用程序中显示网页. 使用WebBrowser 控件, ...
- java常见反编译工具
1.Java反编译插件 —— Jadclipse JadClipse是Jad的Eclipse插件,是一款非常实用而且方便地Java反编译插件,我们只需将下载的插件包复制到eclipse的plugins ...
- 理解Java中的ThreadLocal
提到ThreadLocal,有些Android或者Java程序员可能有所陌生,可能会提出种种问题,它是做什么的,是不是和线程有关,怎么使用呢?等等问题,本文将总结一下我对ThreadLocal的理解和 ...
- OpenCV 脸部跟踪(3)
前面一篇文章我们生成了脸部特征的线性形状模型,本章来学习一下显示线性形状的代码. 线性模型类的结构如下: class shape_model { ...
- Siamese Network简介
Siamese Network简介 Siamese Network 是一种神经网络的框架,而不是具体的某种网络,就像seq2seq一样,具体实现上可以使用RNN也可以使用CNN. 简单的说,Siame ...
- 转:pytorch版的bilstm+crf实现sequence label
http://blog.csdn.net/appleml/article/details/78664824 在理解CRF的时候费了一些功夫,将一些难以理解的地方稍微做了下标注,隔三差五看看加强记忆, ...
- [干货]Kaggle热门 | 用一个框架解决所有机器学习难题
新智元推荐 来源:LinkedIn 作者:Abhishek Thakur 译者:弗格森 [新智元导读]本文是数据科学家Abhishek Thakur发表的Kaggle热门文章.作者总结了自己参加100 ...