signal函式說明

2021-06-01 13:43:23 字數 3506 閱讀 5860

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 這個式子與上面式子的區別在於用...