日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

signal函数说明

發布時間:2023/12/9 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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函数说明的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。