c語言中signal函式詳細解釋說明
對於 訊號處理函式 位於 中.
void ( *signal( int sig, void (* handler)( int ))) ( int );
這個函式的宣告很是嚇人, 一看就難弄懂. 下面是解釋用法.
一步一步解釋:
int (*p)();
這是乙個函式指標, p所指向的函式是乙個不帶任何引數, 並且返回值為int的乙個函式.
int (*fun())();
這個式子與上面式子的區別在於用fun()代替了p,而fun()是乙個函式,所以說就可以看成是fun()這個函式執行之後,它的返回值是乙個函式指標,這個函式指標(其實就是上面的p)所指向的函式是乙個不帶任何引數,並且返回值為int的乙個函式.
所以說對於
void (*signal(int signo, void (*handler)(int)))(int);就可以看成是signal()函式(它自己是帶兩個引數,乙個為整型,乙個為函式指標的函式), 而這個signal()函式的返回值也為乙個函式指標,這個函式指標指向乙個帶乙個整型引數,並且返回值為void的乙個函式.
而你在寫訊號處理函式時對於訊號處理的函式也是void sig_fun(int signo);這種型別,恰好與上面signal()函式所返回的函式指標所指向的函式是一樣的.
注意, void ( *signal() )( int );
signal是乙個函式, 它返回乙個函式指標, 後者所指向的函式接受乙個整型引數 且沒有返回值, 仔細看, 是不是siganal( int signo, void (*handler)(int) )的第2個引數了, 對了, 其實他所返回的就是 signal的第2個訊號處理函式, 指向訊號處理函式, 就可以執行函式了( signal內部時, signal把訊號做為引數傳遞給handler訊號處理函式, 接著 signal 函式返回指標, 並且又指向訊號處理函式, 就開始執行它)
對於這個問題, 在
上述宣告格式比較複雜,如果不清楚如何使用,也可以通過下面這種型別定義的格式來使用(posix的定義):
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
但這種格式在不同的系統中有不同的型別定義,所以要使用這種格式,最好還是參考一下聯機手冊。
在呼叫中,引數signum指出要設定處理方法的訊號。第二個引數handler是乙個處理函式,或者是
sig_ign:忽略引數signum所指的訊號。
sig_dfl:恢復引數signum所指訊號的處理方法為預設值。
傳遞給訊號處理例程的整數引數是訊號值,這樣可以使得乙個訊號處理例程處理多個訊號。系統呼叫signal返回值是指定訊號signum前一次的處理例程或者錯誤時返回錯誤**sig_err。下面來看乙個簡單的例子:
#include
#include
#include
void sigroutine(int dunno)
return;
}
int main()
其中訊號sigint由按下ctrl-c發出,訊號sigquit由按下ctrl-發出。該程式執行的結果如下:
localhost:~$ ./sig_test
process id is 463
get a signal -sigint //按下ctrl-c得到的結果
get a signal -sigquit //按下ctrl-得到的結果
//按下ctrl-z將程序置於後台
[1]+ stopped ./sig_test
localhost:~$ bg
[1]+ ./sig_test &
localhost:~$ kill -hup 463 //向程序傳送sighup訊號
localhost:~$ get a signal – sighup
kill -9 463 //向程序傳送sigkill訊號,終止程序
localhost:~$
C語言中的signal函式
以下的訊號沒在posix.1中列出,而在susv2列出 sigbus 10,7,10 c 匯流排錯誤 錯誤的記憶體訪問 sigpoll a sys v定義的pollable事件,與sigio同義 sigprof 27,27,29 a profiling定時器到 sigsys 12,12 c 無效的系...
Signal 函式詳細介紹
include typedef void sighandler t int sighandler t signal int signum,sighandler t handler include include int main int argc,char argv include include ...
C語言中float與double的詳細解說
double float都是浮點型。double 雙精度型 比float 單精度型 存的資料更準確些,佔的空間也更大。double精度是float的兩倍,所以需要更精確的計算常使用double。單精度浮點數在機內佔4個位元組,用32位二進位制描述。雙精度浮點數在機內佔8個位元組,用64位二進位制描述...