亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

signal函數是什么

發布時間:2021-10-14 15:25:42 來源:億速云 閱讀:117 作者:柒染 欄目:編程語言

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函數是什么的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东海县| 万载县| 福泉市| 永德县| 平凉市| 额济纳旗| 进贤县| 平阳县| 安平县| 鲜城| 衡水市| 普格县| 景德镇市| 平潭县| 陆良县| 北安市| 达日县| 慈溪市| 炉霍县| 阿克苏市| 临邑县| 玉门市| 霍山县| 札达县| 南投市| 开原市| 云和县| 延津县| 诸城市| 乡城县| 县级市| 绵阳市| 固始县| 南丰县| 杭锦后旗| 阜新| 通许县| 河曲县| 莎车县| 保靖县| 盘锦市|