您好,登錄后才能下訂單哦!
signal函數是什么,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
c traps and pitfalls 對signal函數解釋得非常詳細。
<signal.h> 中
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
函數返回指針, 并且又指向信號處理函數, 就開始執行它)
那么,signal函數的參數又是如何呢?signal函數接受兩個參數:一個整型的信號編號,以及一個指向用戶定義的信號處理函數的指針。我們此前已經定義了指向用戶定義的信號處理函數的指針sfp:
void (*sfp)(int); |
sfp 的類型可以通過將上面的聲明中的sfp去掉而得到,即void (*)(int)。此外,signal函數的返回值是一個指向調用前的用戶定義信號處理函數的指針,這個指針的類型與sfp指針類型一致。因此,我們可以如下聲明signal函數:
void (*signal(int, void(*)(int)))(int); |
同樣地,使用typedef可以簡化上面的函數聲明:
typedef void (*HANDLER)(int); HANDLER signal(int, HANDLER); |
下面來看一個簡單的例子:
#include <signal.h> #include <unistd.h> #include <stdio.h> void sigroutine(int dunno) { /* 信號處理例程,其中dunno將會得到信號的值 */ 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); //* 下面設置三個信號的處理方法 signal(SIGINT, sigroutine); signal(SIGQUIT, sigroutine); for (;;) ; }
其中信號SIGINT由按下Ctrl-C發出,信號SIGQUIT由按下Ctrl-發出。該程序執行的結果如下:
[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<sl 20:24 0:00 /sbin/audispd root 1275 0.0 0.0 1880 580 ? Ss 20:24 0:00 /usr/sbin/acpid 68 1395 0.0 0.0 3384 948 ? S 20:24 0:00 hald-addon-acpi: listening on acpid socket /var/run/acpid.socket root 1669 0.0 0.5 22344 6028 ? Ss 20:26 0:00 /usr/sbin/abrtd root 1697 0.0 0.0 2240 320 ? Ss 20:26 0:00 /usr/sbin/atd root 1742 1.6 2.1 32496 21752 tty1 Rs+ 20:26 1:47 /usr/bin/Xorg :0 -nr -verbose -auth /var/run/gdm/auth-for-gdm-eLxmfB/database -nolisten tcp vt1 zcm 2388 0.0 1.4 34860 15316 ? S 20:32 0:00 python /usr/share/system-config-printer/applet.py zcm 7666 7.5 0.0 1728 356 pts/0 T 22:15 0:06 ./a zcm 7714 0.0 0.0 5816 724 pts/0 S+ 22:17 0:00 grep ./a [zcm@t #32]$kill -HUP 463 bash: kill: (463) - 沒有那個進程 [zcm@t #33]$kill -HUP 7666 [zcm@t #34]$kill -9 7666 [zcm@t #35]$ps aux|grep ./a root 1164 0.0 0.0 13320 748 ? S<sl 20:24 0:00 /sbin/audispd root 1275 0.0 0.0 1880 580 ? Ss 20:24 0:00 /usr/sbin/acpid 68 1395 0.0 0.0 3384 948 ? S 20:24 0:00 hald-addon-acpi: listening on acpid socket /var/run/acpid.socket root 1669 0.0 0.5 22344 6028 ? Ss 20:26 0:00 /usr/sbin/abrtd root 1697 0.0 0.0 2240 320 ? Ss 20:26 0:00 /usr/sbin/atd root 1742 1.6 2.1 32496 21752 tty1 Rs+ 20:26 1:48 /usr/bin/Xorg :0 -nr -verbose -auth /var/run/gdm/auth-for-gdm-eLxmfB/database -nolisten tcp vt1 zcm 2388 0.0 1.4 34860 15324 ? S 20:32 0:00 python /usr/share/system-config-printer/applet.py zcm 7746 0.0 0.0 5816 756 pts/0 S+ 22:18 0:00 grep ./a [1]+ 已殺死 ./a [zcm@t #36]$
看完上述內容,你們掌握signal函數是什么的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。