signal()是一種系統(tǒng)調(diào)用,用于通知運(yùn)行時(shí)系統(tǒng),當(dāng)某種特定的“軟件中斷”發(fā)生時(shí)調(diào)用特定的程序。它的真正的名字應(yīng)該是“Call_that_routine_when_this_interrupt_Comes_in(當(dāng)該中斷發(fā)生時(shí)調(diào)用那個(gè)程序)”,調(diào)用signal()函數(shù),并通過(guò)參數(shù)傳遞告訴它終端類(lèi)型以及用于處理中斷的程序。
成都創(chuàng)新互聯(lián)作為成都網(wǎng)站建設(shè)公司,專(zhuān)注重慶網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì),有關(guān)成都企業(yè)網(wǎng)站定制方案、改版、費(fèi)用等問(wèn)題,行業(yè)涉及成都人造霧等多個(gè)領(lǐng)域,已為上千家企業(yè)服務(wù),得到了客戶(hù)的尊重與認(rèn)可。
ANSIC 標(biāo)準(zhǔn)中,signal()函數(shù)的聲明如下:
void (*signal (int sig ,void (*func)(int))) (int) ;
signal是一個(gè)函數(shù),他返回一個(gè)函數(shù)指針,后者所指向的函數(shù)接受一個(gè)int參數(shù)并返回void 。
exit()通常是用在子程序中用來(lái)終結(jié)程序用的,使用后程序自動(dòng)結(jié)束,跳回操作系統(tǒng)。
在c語(yǔ)言中: exit(0):表示正常退出;exit(1):表示異常退出,這個(gè)1是返回給操作系統(tǒng);值是返回操作系統(tǒng)的:0是正常退出,而其他值都是異常退出,所以我們?cè)谠O(shè)計(jì)程序時(shí),可以在推出前給一些小的提示信息,或者在調(diào)試程序的過(guò)程中查看出錯(cuò)原因。
使用exit()時(shí),可以不論main()的返回值類(lèi)型,它的頭文件是 stdlib.h。
擴(kuò)展資料:
進(jìn)程函數(shù):所在函數(shù)庫(kù)為stdlib.h、process.h
void abort() 此函數(shù)通過(guò)調(diào)用具有出口代碼3的_exit寫(xiě)一個(gè)終止信息于stderr,并異常終止程序 無(wú)返回值。
void _exit(int status)終止當(dāng)前程序,但不清理現(xiàn)場(chǎng)。
void exit(int status) 終止當(dāng)前程序,關(guān)閉所有文件,寫(xiě)緩沖區(qū)的輸出(等待輸出),并調(diào)用任何寄存器的"出口函數(shù)",無(wú)返回值。
參考資料:百度百科-C語(yǔ)言函數(shù)
signal(SIGALRM, alarmhandle); 表示給當(dāng)前進(jìn)程注冊(cè)SIGALRM信號(hào)處理代碼,如果收到SIGALRM信號(hào),就會(huì)去執(zhí)行alarmhandle函數(shù)
$?man?signal
...
SYNOPSIS
#include?signal.h
typedef?void?(*sighandler_t)(int);
sighandler_t?signal(int?signum,?sighandler_t?handler);
DESCRIPTION
The??signal()?system?call?installs?a?new?signal?handler?for?the?signal?with?number?signum.??The?signal?handler?is?set?to?sighandler?which?may?be?a?user?specified?function,?or?either?SIG_IGN?or?SIG_DFL.
signal()函數(shù)是個(gè)系統(tǒng)調(diào)用,該函數(shù)按signum設(shè)定一個(gè)新的信號(hào)處理句柄(函數(shù)).新設(shè)定的處理函數(shù)可以是用戶(hù)自定義的函數(shù),也可以是系統(tǒng)指定的SIG_IGN?或?SIG_DFL.
參考代碼:
#include?signal.h
#include?unistd.h
#include?stdio.h
#include?stdlib.h
void?alarmhandle(int?sig)
{
printf("recv?sig:%d\n",?sig?);
printf("exit!\n");
exit(0);
}
int?main()
{
signal(?SIGALRM,?alarmhandle?);
printf("begin...\n");
alarm(5);?//定時(shí)器,用于在5秒后產(chǎn)生SIGALRM信號(hào)
while(?1?);
return?0;
}
運(yùn)行結(jié)果:
begin...
recv sig:14
exit!
信號(hào)是程序執(zhí)行過(guò)程中出現(xiàn)的異常情況。它可能是由程序中的錯(cuò)誤造成的,例如引用內(nèi)存中的一個(gè)非法地址;或者是由程序數(shù)據(jù)中的錯(cuò)誤造成的,例如浮點(diǎn)數(shù)被0除;或者是由外部事件引發(fā)的,例如用戶(hù)按了Ctrl+Break鍵。
你可以利用標(biāo)準(zhǔn)庫(kù)函數(shù)signal()指定要對(duì)這些異常情況采取的處理措施(實(shí)施處理措施的函數(shù)被稱(chēng)為“信號(hào)處理函數(shù)”)。signal()的原型為:
#include signal.h
void(*signal(int hum,void(*func)(int)))(int);
如果定義一個(gè)typedef,理解起來(lái)就容易一些了。下面給出的sigHandler_t類(lèi)型是指向一個(gè)程序的指針,該函數(shù)有一個(gè)int類(lèi)型的參數(shù),并且返回一個(gè)void類(lèi)型:
typedef void(*sigHandler_t)(int);
sigHandler_t signal(int num , sigHandler_t func);
signal()有兩個(gè)參數(shù),分別為int類(lèi)型和sigHandler_t類(lèi)型,其返回值為sigHandler_t類(lèi)型。以func參數(shù)形式傳遞給signal()的那個(gè)函數(shù)將成為第num號(hào)異常情況的新的信號(hào)處理函數(shù)。signal()的返回值是信號(hào)hum原來(lái)的信號(hào)處理函數(shù)。在設(shè)置了一個(gè)暫時(shí)的信號(hào)處理函數(shù)之后,你可以利用該值恢復(fù)程序先前的行為。num的可能值依賴(lài)于系統(tǒng),并且在signal.h中列出。func的可能值可以是你的程序中的任意函數(shù),或者是SIG_DFL和SLG_IGN這兩個(gè)特別定義的值之一。SIG_DFL是指系統(tǒng)的缺省處理措施,通常是暫停執(zhí)行程序;SIG_IGN表示信號(hào)將被忽略。
當(dāng)前標(biāo)題:c語(yǔ)言信號(hào)處理函數(shù) C語(yǔ)言信號(hào)量
文章轉(zhuǎn)載:http://jinyejixie.com/article10/dodoedo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷(xiāo)、搜索引擎優(yōu)化、微信小程序、App開(kāi)發(fā)、定制開(kāi)發(fā)、虛擬主機(jī)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)