探秘C-signal信号

原创 2015年11月20日 10:01:31

探秘C程序中的信号

简单的不多说,也就不进行简单的介绍了。

可移植性:

首先对于<signal.h>中声明的函数不能完全的安全的定义一种可移植的用法,原则上,可以为一个只有raise报告的信号指定一个处理程序,但是很难想象它的那些方面比<setjmp.h>中的跳转函数做得更好,同时也不能保证一个指定的信号在C语言的所有实现中不可能报告,所以不管什么时候程序处理信号,它的可移植性都会受到限制。

C标准库关于信号的一些内容:

在头文件<signal.h>为处理各种各样的信号声明了一个类型和两个函数,并定义了几个宏。

定义类型:

sig_atomic_t  :这个类型的对象可以作为一个原子实体被访问,即使有异步中断发生的时候也是如此。

定义的宏:

SIG_DFL

SIG_ERR

SIG_IGN

这个三个宏展开为具有不同值的常量表达式,且他们的值和所有声明的函数的地址都不相等,下面还有几个宏,都展开为正的数值常数表达式,他们主要针对具体的情况对应的信号。

SIGABRT    异常终止,例如调用了abort()函数

SIGFPE       错误的算术操作,除0或溢出,现在广泛的所有的溢出都报告这个信号

SIGILL        一条无效的函数影像

SIGINT        收到一个交互的提示信号,异步可中断原子操作,若未保存上下文,无法恢复执行

SIGSEGV     对存储器的无效访问,段越界,就是段错误的信号

SIGTERM     送到程序中的终止请求

 

定义的函数

#include <signal.h>

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);        /*信号处理函数*/

int raise(int sig);                                        /*信号发送函数*/

<signal.h>的实现

这里我们依然是为了探秘原理,做一个简单的小例子。

首先说一下硬件信号吧。

硬件信号和我们其他一些软件信号是不同的,在某些系统中,有些代码需要得到控制权,由于这是异步的所以会选择将这些代码添加进signal 中。所以硬件系统或者计算机本身报告的信号,所以这里一定要小心。很多系统都会把控制权转移到指定的地址,但不会遵守C函数调用和返回的规则,所以处理这些每一个信号都必须使用一些汇编代码。

来硬性的告诉操作系统,这些代码需要得到控制权,此时会从这些静态的代码中获取权限。然后执行。

我们这里的着眼点主要聚焦于软件层面上。

[c]

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<signal.h>
#include<string.h>
#include<stdlib.h>

typedef int sig_atomic_t ;
typedef void _sigfun(int);

_sigfun *_sigtable[_NSIG] = {0};

int (raise)(int sig){
_sigfun *s;
if(sig <= 0 || _NSIG <= sig)
return (-1);
if((s = _sigtable[sig]) != SIG_IGN && s != SIG_DFL)
{
_sigtable[sig] = SIG_DFL;
(*s)(sig);
}else if(s == SIG_DFL){
char ac[10],*p;
switch(sig){
case SIGABRT:
p = "abort";
break;
case SIGFPE:
p = "arithmetic error";
break;
case SIGILL:
p = "invaild executable code";
break;
case SIGSEGV:
p = "termination request";
break;
default :
*(p = &ac[(sizeof ac)-1]) = '\0';
do{
*--p = sig %10 + '0';

}while((sig /= 10) != 0);
fputs("signal #",stderr);
}
fputs(p,stderr);
fputs("----terminating \n",stderr);
exit(EXIT_FAILURE);
}
return 0;
}

_sigfun * (signal)(int sig,_sigfun *fun)
{
_sigfun *s;
if(sig <= 0 || _NSIG <= sig || fun == SIG_ERR)
return (SIG_ERR);
s = _sigtable[sig];
_sigtable[sig] = fun;
fun(sig);
return (s);
}

void signalfun(int sig){
printf("I get the signal and take it\n");
return ;
}
int main(){
signal(SIGINT,signalfun);
kill(getpid(),SIGINT);

}

[/c]

查看原文:http://zmrlinux.com/2015/11/20/%e6%8e%a2%e7%a7%98c-signal%e4%bf%a1%e5%8f%b7/

版权声明:本文为博主原创文章,未经博主允许不得转载。

黑客动画吧-黑客闯关之古墓探秘攻略

开始页面如下:要在这个页面上找到进入第一关的入口,肯定是有什么地方时可以点击的,那么就去源代码中找找看。打开控制台,审查元素。发现盔甲头那里有一个链接,点击进入第一关。 http://hkyx.my...
  • a200710716
  • a200710716
  • 2016年04月18日 19:31
  • 7566

<Linux内核探秘>读书笔记

Linux 文件系统探秘 (Linux内核探秘(高剑林著 )读书笔记) 一 文件系统基本概念 1.1 VFS     Linux内核通过虚拟文件系统(VFS)管理文件系统。     对每个具体文件...
  • bcbobo21cn
  • bcbobo21cn
  • 2015年09月09日 09:30
  • 479

《.NET探秘:MSIL权威指南》读书笔记

第1章 简单示例 (第2页至第20页)   第3页,倒数第4自然段IL代码由CLR“托管”。CLR托管至少包括三个主要的活动:类型控制、结构化异常处理和垃圾收集。类型控制涉及在执行期间项类...
  • u013948190
  • u013948190
  • 2015年07月31日 06:22
  • 502

【002】【HotSpot虚拟机对象探秘】

对象创建 Java 是一门面向对象的编程语言,在Java 程序运行过程中无时无刻都有对象被创建出来.在语言层面上,创建对象(例如克隆、反序列化)通常仅仅是一个new 关键字而己,而在虚拟机中,对象(...
  • DERRANTCM
  • DERRANTCM
  • 2015年03月17日 19:13
  • 1008

黑客丛林之旅通关攻略(共14关)

游戏地址:http://www.fj543.com/hack/ 这类游戏可以学到好些东西,推荐玩玩。 希望攻略对你有帮助。(提倡自己先思考)有什么不对的地方欢迎留言指出,本攻略算是完结了...
  • u013205484
  • u013205484
  • 2015年07月05日 22:12
  • 5513

OSGi 探秘系列 (1) - 概述什么是OSGi框架

现在越来越多的Java开发人员在谈论OSGi是有其道理的。在几年前上学的时候我进行了比较多的Eclipse插件开发,当时就亲身感觉到Eclipse插件体系的灵活与强大,而该体系与OSGi也可谓一脉相承...
  • liubag
  • liubag
  • 2014年04月02日 21:44
  • 1384

每周荐书(京东篇):618取胜之道、质量保障、技术解密

每周荐书(京东篇):618取胜之道、质量保障、技术解密(评论送书) 感谢大家对荐书栏目的支持,先公布下上期活动中奖名单 yaabbcdmaTwumf_1997跟老齐学Python:Django实战 芝...
  • broadview2006
  • broadview2006
  • 2017年10月17日 10:00
  • 33443

linux内核探秘4---文件系统(最简单的文件系统aufs)

http://blog.chinaunix.net/uid-27052262-id-3259907.html  http://blog.csdn.net/rstevens/article/detai...
  • sinat_16790541
  • sinat_16790541
  • 2014年10月12日 21:27
  • 1282

php底层深度探索(一)

转自:http://blog.csdn.net/phphot/article/details/3985363 一、开篇 在开始这个专题之前,先说一点题外话。大多数人学习编程语言的时候,首先关注...
  • DADADIE
  • DADADIE
  • 2015年03月29日 21:34
  • 747

深入探索spring技术内幕(五): 剖析spring AOP工作原理

一、前言 AOP (Aspect Oriented Programing) - 面向切面编程,它主要用于日志记录、性能分析、安全控制、事务处理、异常处理等方面。 AOP主要使用JDK的反射...
  • wxw520zdh
  • wxw520zdh
  • 2016年10月04日 09:56
  • 516
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:探秘C-signal信号
举报原因:
原因补充:

(最多只允许输入30个字)