signal.h(c標準庫)

看代碼,代碼和操做系統關係仍是很大,未測試安全

 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 #endif
26 
27 typedef int sig_atomic_t;
28 typedef void _sigfun(int);
29 
30 #define MY_SIGABRT _SIGABRT
31 #define MY_SIGINT   2
32 #define MY_SIGILL   4
33 #define MY_SIGFPE   8
34 #define MY_SIGSEGV  11
35 #define MY_SIGTERM   15
36 #define _NSIG   _SIGMAX 
37 
38 #define MY_SIG_DFL  (_sigfun *)0
39 #define MY_SIG_ERR  (_sigfun *)-1
40 #define MY_SIG_IGN  (_sigfun *)1
41 
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 <stdio.h>
 3 #include <stdlib.h>
 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 }
相關文章
相關標籤/搜索