c語言中signal函式詳細解釋說明

2021-05-24 22:16:39 字數 2062 閱讀 6792

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位二進位制描述...