進(jìn)程間通信之:信號
1.信號處理函數(shù)
(1)函數(shù)說明。
使用signal()函數(shù)處理時(shí),只需要指出要處理的信號和處理函數(shù)即可。它主要是用于前32種非實(shí)時(shí)信號的處理,不支持信號傳遞信息,但是由于使用簡單、易于理解,因此也受到很多程序員的歡迎。
Linux還支持一個(gè)更健壯、更新的信號處理函數(shù)sigaction(),推薦使用該函數(shù)。
(2)函數(shù)格式。
signal()函數(shù)的語法要點(diǎn)如表8.11所示。
表8.11 signal()函數(shù)語法要點(diǎn)
所需頭文件 | #includesignal.h> | |
函數(shù)原型 | void(*signal(intsignum,void(*handler)(int)))(int) | |
函數(shù)傳入值 | signum:指定信號代碼 | |
handler: | SIG_IGN:忽略該信號 | |
SIG_DFL:采用系統(tǒng)默認(rèn)方式處理信號 | ||
自定義的信號處理函數(shù)指針 | ||
函數(shù)返回值 | 成功:以前的信號處理配置 | |
出錯(cuò):-1 |
這里需要對這個(gè)函數(shù)原型進(jìn)行說明。這個(gè)函數(shù)原型有點(diǎn)復(fù)雜。可先用如下的typedef進(jìn)行替換說明:
typedefvoidsign(int);
sign*signal(int,handler*);
可見,首先該函數(shù)原型整體指向一個(gè)無返回值并且?guī)б粋€(gè)整型參數(shù)的函數(shù)指針,也就是信號的原始配置函數(shù)。接著該原型又帶有兩個(gè)參數(shù),其中的第二個(gè)參數(shù)可以是用戶自定義的信號處理函數(shù)的函數(shù)指針。
表8.12列舉了sigaction()的語法要點(diǎn)。
表8.12 sigaction()函數(shù)語法要點(diǎn)
所需頭文件 | #includesignal.h> |
函數(shù)原型 | intsigaction(intsignum,conststructsigaction*act,structsigaction*oldact) |
函數(shù)傳入值 | signum:信號代碼,可以為除SIGKILL及SIGSTOP外的任何一個(gè)特定有效的信號 |
act:指向結(jié)構(gòu)sigaction的一個(gè)實(shí)例的指針,指定對特定信號的處理 | |
oldact:保存原來對相應(yīng)信號的處理 | |
函數(shù)返回值 | 成功:0 |
出錯(cuò):-1 |
這里要說明的是sigaction()函數(shù)中第2個(gè)和第3個(gè)參數(shù)用到的sigaction結(jié)構(gòu)。這是一個(gè)看似非常復(fù)雜的結(jié)構(gòu),希望讀者能夠慢慢閱讀此段內(nèi)容。
首先給出了sigaction的定義,如下所示:
structsigaction
{
void(*sa_handler)(intsigno);
sigset_tsa_mask;
intsa_flags;
void(*sa_restore)(void);
}
sa_handler是一個(gè)函數(shù)指針,指定信號處理函數(shù),這里除可以是用戶自定義的處理函數(shù)外,還可以為SIG_DFL(采用缺省的處理方式)或SIG_IGN(忽略信號)。它的處理函數(shù)只有一個(gè)參數(shù),即信號值。
sa_mask是一個(gè)信號集,它可以指定在信號處理程序執(zhí)行過程中哪些信號應(yīng)當(dāng)被屏蔽,在調(diào)用信號捕獲函數(shù)之前,該信號集要加入到信號的信號屏蔽字中。
sa_flags中包含了許多標(biāo)志位,是對信號進(jìn)行處理的各個(gè)選擇項(xiàng)。它的常見可選值如表8.13所示。
表8.13 常見信號的含義及其默認(rèn)操作
選項(xiàng) | 含義 |
SA_NODEFERSA_NOMASK | 當(dāng)捕捉到此信號時(shí),在執(zhí)行其信號捕捉函數(shù)時(shí),系統(tǒng)不會自動屏蔽此信號 |
SA_NOCLDSTOP | 進(jìn)程忽略子進(jìn)程產(chǎn)生的任何SIGSTOP、SIGTSTP、SIGTTIN和SIGTTOU信號 |
SA_RESTART | 令重啟的系統(tǒng)調(diào)用起作用 |
SA_ONESHOTSA_RESETHAND | 自定義信號只執(zhí)行一次,在執(zhí)行完畢后恢復(fù)信號的系統(tǒng)默認(rèn)動作 |
模擬信號相關(guān)文章:什么是模擬信號
linux相關(guān)文章:linux教程
數(shù)字通信相關(guān)文章:數(shù)字通信原理
通信相關(guān)文章:通信原理
評論