c traps and pitfalls 對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 函式返回指標, 並且又指向訊號處理函式, 就開始執行它)
那麼,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 #include #include void sigroutine(int dunno)
return;
}int main()
其中訊號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 ? sroot 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 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 ? sroot 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 7746 0.0 0.0 5816 756 pts/0 s+ 22:18 0:00 grep ./a
[1]+ 已殺死 ./a
[zcm@t #36]$
signal()函式說明
表頭檔案 include 功 能 設定某一訊號的對應動作 函式原型 void signal int signum,void handler int int 或者 typedef void sig t int sig t signal int signum,sig t handler 引數說明 第乙個...
signal函式說明
c traps and pitfalls 對signal函式解釋得非常詳細。中void signal int sig,void handler int int int p 這是乙個函式指標,p所指向的函式是乙個不帶任何引數,並且返回值為int的乙個函式.int fun 這個式子與上面式子的區別在於用...
使用者空間的signal函式說明
c traps and pitfalls 對signal函式解釋得非常詳細。中void signal int sig,void handler int int int p 這是乙個函式指標,p所指向的函式是乙個不帶任何引數,並且返回值為int的乙個函式.int fun 這個式子與上面式子的區別在於用...