博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
signal.h(c标准库)
阅读量:6548 次
发布时间:2019-06-24

本文共 2946 字,大约阅读时间需要 9 分钟。

看代码,代码和操作系统关系还是很大,未测试

1 /*my_signal.h*/ 2 /* 3  * 信号是程序执行过程中发生的异常事件。 4  * 同步信号的产生是因为程序自身的某些动作,例如除零或不正当地访问存储器。 5  * 异步信号是由程序外部的行为引起的。如敲击提示键,或另一个程序给你的程序发的信号,都会引发一个异步信号。 6  *  7  * 程序不能屏蔽的信号要求立即得到处理。不处理,终止且向标准错误流输出一条错误信息。 8  * 9  * signal.h定义了一个无穷信号集的各种编码值。声明2个函数。10  * raise,报告一个同步信号。11  * signal,指定一种信号的处理方法。默认处理终止程序;信号忽略是直接将信号丢弃;信号处理是把控制权转移给一个指定的函数。12  * 在3情况下,c在遇到一个报告的信号时,就会调用相应的信号处理程序,程序的正常执行就会被挂起。如果信号处理程序把控制权返回给调用者,13  * 程序就会从它被挂起的那个点继续执行。一个可移植的程序几乎不能安全地使用信号处理程序。14  *15  * 一个信号处理程序内访问的所有数据对象声明为volatile类型。16  * sig_atomic_t类型,它是一个程序以原子方式访问的整数类型。一个信号在程序访问这种类型的数据对象的过程中,决不会挂起程序。17  *18  * 信号可能丢失,信号处理程序处理一个信号之前,又有一个信号发生,那么就会有个信号被忽略。19  * 可移植性不高或者说不可移植。unix系统一般调用系统服务signal完成所有工作。20  */21 #ifndef MY_SIGNAL_H_22 #define MY_SIGNAL_H_23 #ifndef _YVALS_H_24 #include "yvals.h"25 #endif26 27 typedef int sig_atomic_t;28 typedef void _sigfun(int);29 30 #define MY_SIGABRT _SIGABRT31 #define MY_SIGINT   232 #define MY_SIGILL   433 #define MY_SIGFPE   834 #define MY_SIGSEGV  1135 #define MY_SIGTERM   1536 #define _NSIG   _SIGMAX 37 38 #define MY_SIG_DFL  (_sigfun *)039 #define MY_SIG_ERR  (_sigfun *)-140 #define MY_SIG_IGN  (_sigfun *)141 42 int raise(int);43 _sigfun *signal(int, _sigfun *);

 

1 /*my_signal.c*/ 2 #include "my_signal.h" 3  4 extern _sigfun *_sigtable[_NSIG]; 5  6 _sigfun *(signal)(int sig, _sigfun *fun) 7 { 8     _sigfun *s; 9 10     if(sig <= 0 || _NSIG <= sig || fun == MY_SIG_ERR)11         return (SIG_ERR);12     s = _sigtable[sig], _sigtable[sig] = fun;13     return s;14 }

 

1 /*my_raise.c*/ 2 #include 
3 #include
4 #include "my_signal.h" 5 6 _sigfun *_sigtable[_NSIG] = {
0}; 7 8 int (raise)(int sig) 9 {10 _sigfun *s;11 12 if(sig <= 0 || _NSIG <= sig)13 return -1;14 if((s = _sigtable[sig]) != MY_SIG_IGN && s != MY_SIG_DFL){15 _sigtable[sig] = MY_SIG_DFL;16 (*s)(sig);17 }else if(s == MY_SIG_DFL){18 char ac[10], *p;19 20 switch (sig){21 case MY_SIGABRT:22 p = "abort";23 break;24 case MY_SIGFPE:25 p = "arithmetic error";26 break;27 case MY_SIGILL;28 p = "invalid executable code";29 break;30 case MY_SIGINT:31 p = "interruption";32 break;33 case MY_SIGSEGV:34 p = "invalid storage access";35 break;36 case MY_SIGTERM:37 p = "termination request";38 default:39 *(p = &ac[(sizeof ac) -1]) = '\0';40 do *--p = sig % 10 + '0';41 while((sig/=10) != 0);42 fputs("signal #", stderr); 43 }44 fputs(p, stderr);45 fputs(" -- terminating\n", stderr);46 exit(EXIT_FAILURE); 47 }48 return 0;49 }

 

转载于:https://www.cnblogs.com/kevin-kang/p/3170441.html

你可能感兴趣的文章
闭包的循环引用 与 解决(三种方法)
查看>>
GCD 与 NSOperation 的对比
查看>>
golang碎片整理之 fmt.Scan
查看>>
nodejs渐入佳境[31]-mongodb+express+middleware绑定用户权限2
查看>>
DHCP常用查看命令
查看>>
详解某大厂区块链服务整体架构
查看>>
伪共享(False Sharing) - 未完待续
查看>>
基于Java 生产者消费者模式(详细分析)
查看>>
OCP 12c最新考试原题及答案(071-5)
查看>>
Spring Cloud 分布式链路跟踪 Sleuth + Zipkin + Elasticsear
查看>>
cookies与session 的区别
查看>>
ping ,time,TTL详解
查看>>
34.省市二级联动
查看>>
2345好压下载|2345好压软件下载
查看>>
win10更新多出来的oem盘,隐藏解决
查看>>
SpringMVC是什么?
查看>>
开发者该掌握的推广经验
查看>>
我的友情链接
查看>>
战术风行×××
查看>>
NFS优缺点
查看>>