看代碼,代碼和操做系統關係仍是很大,未測試安全
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 }