signal函數(shù)是什么,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
成都創(chuàng)新互聯(lián)擁有網(wǎng)站維護(hù)技術(shù)和項(xiàng)目管理團(tuán)隊(duì),建立的售前、實(shí)施和售后服務(wù)體系,為客戶提供定制化的成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、外貿(mào)營銷網(wǎng)站建設(shè)、網(wǎng)站維護(hù)、達(dá)州電信機(jī)房解決方案。為客戶網(wǎng)站安全和日常運(yùn)維提供整體管家式外包優(yōu)質(zhì)服務(wù)。我們的網(wǎng)站維護(hù)服務(wù)覆蓋集團(tuán)企業(yè)、上市公司、外企網(wǎng)站、成都做商城網(wǎng)站、政府網(wǎng)站等各類型客戶群體,為全球近1000家企業(yè)提供全方位網(wǎng)站維護(hù)、服務(wù)器維護(hù)解決方案。
c traps and pitfalls 對(duì)signal函數(shù)解釋得非常詳細(xì)。
void ( *signal( int sig, void (* handler)( int ))) ( int );
int (*p)();
這是一個(gè)函數(shù)指針, p所指向的函數(shù)是一個(gè)不帶任何參數(shù), 并且返回值為int的一個(gè)函數(shù).
int (*fun())();
這個(gè)式子與上面式子的區(qū)別在于用fun()代替了p,而fun()是一個(gè)函數(shù),所以說就可以看成是fun()這個(gè)函數(shù)執(zhí)行之后,它的返回值是一個(gè)函數(shù)指針,這個(gè)函數(shù)指針(其實(shí)就是上面的p)所指向的函數(shù)是一個(gè)不帶任何參數(shù),并且返回值為int的一個(gè)函數(shù).
void (*signal(int signo, void (*handler)(int)))(int);就可以看成是signal()函數(shù)(它自己是帶兩個(gè)參數(shù),一個(gè)為整型,一個(gè)為函數(shù)指針的函數(shù)), 而這個(gè)signal()函數(shù)的返回值也為一個(gè)函數(shù)指針,這個(gè)函數(shù)指針指向一個(gè)帶一個(gè)整型參數(shù),并且返回值為void的一個(gè)函數(shù).
在寫信號(hào)處理函數(shù)時(shí)對(duì)于信號(hào)處理的函數(shù)也是void sig_fun(int signo);這種類型,恰好與上面signal()函數(shù)所返回的函數(shù)指針?biāo)赶虻暮瘮?shù)是一樣的.
void ( *signal() )( int );
signal是一個(gè)函數(shù), 它返回一個(gè)函數(shù)指針, 后者所指向的函數(shù)接受一個(gè)整型參數(shù) 且沒有返回值, 仔細(xì)看, 是不是siganal( int signo, void (*handler)(int) )的第2個(gè)參數(shù)了, 對(duì)了, 其實(shí)他所返回的就是 signal的第2個(gè)信號(hào)處理函數(shù), 指向信號(hào)處理函數(shù), 就可以執(zhí)行函數(shù)了( signal內(nèi)部時(shí), signal把信號(hào)做為參數(shù)傳遞給handler信號(hào)處理函數(shù), 接著 signal
函數(shù)返回指針, 并且又指向信號(hào)處理函數(shù), 就開始執(zhí)行它)
那么,signal函數(shù)的參數(shù)又是如何呢?signal函數(shù)接受兩個(gè)參數(shù):一個(gè)整型的信號(hào)編號(hào),以及一個(gè)指向用戶定義的信號(hào)處理函數(shù)的指針。我們此前已經(jīng)定義了指向用戶定義的信號(hào)處理函數(shù)的指針sfp:
void (*sfp)(int); |
sfp 的類型可以通過將上面的聲明中的sfp去掉而得到,即void (*)(int)。此外,signal函數(shù)的返回值是一個(gè)指向調(diào)用前的用戶定義信號(hào)處理函數(shù)的指針,這個(gè)指針的類型與sfp指針類型一致。因此,我們可以如下聲明signal函數(shù):
void (*signal(int, void(*)(int)))(int); |
同樣地,使用typedef可以簡化上面的函數(shù)聲明:
typedef void (*HANDLER)(int); HANDLER signal(int, HANDLER); |
下面來看一個(gè)簡單的例子:
#include#include #include void sigroutine(int dunno) { /* 信號(hào)處理例程,其中dunno將會(huì)得到信號(hào)的值 */ switch (dunno) { case 1: printf("Get a signal -- SIGHUP\n "); break; case 2: printf("Get a signal -- SIGINT\n "); break; case 3: printf("Get a signal -- SIGQUIT\n "); break; } return; } int main() { printf("process id is %d\n ",getpid()); signal(SIGHUP, sigroutine); //* 下面設(shè)置三個(gè)信號(hào)的處理方法 signal(SIGINT, sigroutine); signal(SIGQUIT, sigroutine); for (;;) ; }
其中信號(hào)SIGINT由按下Ctrl-C發(fā)出,信號(hào)SIGQUIT由按下Ctrl-發(fā)出。該程序執(zhí)行的結(jié)果如下:
[zcm@t #29]$make gcc -g -c -o a.o a.c gcc -g -o a a.o [zcm@t #30]$./a process id is 7666 ^C Get a signal -- SIGINT ^Z [1]+ Stopped ./a [zcm@t #31]$ps aux|grep ./a root 1164 0.0 0.0 13320 748 ? S看完上述內(nèi)容,你們掌握signal函數(shù)是什么的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
當(dāng)前名稱:signal函數(shù)是什么
瀏覽路徑:http://weahome.cn/article/jscecd.html