前言

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. pio 背景色

    This example shows you Excel cell fills and colors using Apache POI. In our example i have used all ...

  2. 哥谭第一季/全集Gotham迅雷下载

    哥谭市 第一季 Gotham (2014)本季看点:<哥谭镇>将由丹尼·加农掌镜,布鲁诺·海勒执笔剧本.电视剧集<哥谭>可以说<蝙蝠侠>的前传,剧集描述的是DC漫画 ...

  3. [转]使用mysql profiles 来查看sql 语句执行计划

    From : http://blog.csdn.net/radkitty/article/details/4632289 要使用该功能,mysql的版本必须在5.0.37版本以上.否则只能使用expl ...

  4. DNS使用的是TCP协议还是UDP协议(转)

    原文链接:DNS使用的是TCP协议还是UDP协议 DNS同时占用UDP和TCP端口53是公认的,这种单个应用协议同时使用两种传输协议的情况在TCP/IP栈也算是个另类.但很少有人知道DNS分别在什么情 ...

  5. 远程连接Oracle数据库

    ylbtech-Oracle:远程连接Oracle数据库  所谓远程连接Oracle数据库,是指Oracle数据库服务器和Oracle客户端分别安装在2台电脑上,我们使用Oracle客户端来连接在另一 ...

  6. Swift3.0:Get/Post同步和异步请求

    一.介绍 Get和Post区别: Get是从服务器上获取数据,Post是向服务器发送数据. 对于Get方式,服务端用Request.QueryString获取变量的值,对于Post方式,服务端用Req ...

  7. sharepoint list 文档上传和删除

    最近项目需要对sharepoint 文件操作,于是自己写了一个简单的工具类分享出来: namespace Microsoft.SharePoint { using System; using Syst ...

  8. Java系列:JVM中的OopMap(zz)

    调用栈里的引用类型数据是GC的根集合(root set)的重要组成部分:找出栈上的引用是GC的根枚举(root enumeration)中不可或缺的一环. JVM选择用什么方式会影响到GC的实现: 如 ...

  9. Convert Sorted List to Binary Search Tree leetcode java

    题目: Given a singly linked list where elements are sorted in ascending order, convert it to a height ...

  10. Centos curl ssl 替换 NSS 为 OpenSSL

    参考:https://www.latoooo.com/xia_zhe_teng/368.htm 我的系统版本是 Centos 7 64位.为了方便,先安装常用的开发环境. yum groupinsta ...