頭文件


頭文件<signal.h>為處理各種各樣的信號聲明了一個類型和兩個函數,並且定義了幾個宏。

1、類型:sig_atomic_t

sig_atomic_t是 int 類型,在信號處理程序中作為變量使用。它是一個對象的整數類型,該對象可以作為一個原子實體訪問,即使存在異步信號時,該對象可以作為一個原子實體訪問。

2、宏:

SIG_DFL  默認的信號處理。

SIG_ERR  表示一個信號錯誤。

SIG_IGN  表示忽略信號。

有效的信號包括:

SIGABRT  異常終止,如調用abort()。

SIGFPE  算術運算出錯,如除數為0或溢出。

SIGILL  非法函數映象,如非法指令。

SIGINT  交互式信號,如中斷。

SIGSEGV  非法訪問存儲器,如訪問不存在的內存單元。

SIGTERM  發送給本程序的終止請求信號。

3、函數:

3.1函數signal

void (*signal(int sig,void (*handle)(int)))(int);

說明:signal()用於確定以后當信號sig出現時的處理方法。

參數:如果handler的值是SIG_DFL,那么就采用實現定義的缺省行為;如果handler的值是SIG_IGN,那么就忽略該信號;否則,調用handler所指向的函數(參數為信號類型)。

返回值:signal()返回信號sig原來的handler;如果出錯,則返回SIG_ERR。

當隨后出現信號sig時,就中斷正在執行的操作,轉而執行信號處理函數(*handler)(sig)。如果從信號處理程序中返回,則從中斷的位置繼續執行。

3.2函數raise

int raise(int sig);

說明:函數raise把信號sig發送給正在執行的程序。

返回值:執行成功返回0,不成功返回非0。

例:

#include <assert.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

static int sigs[]={SIGABRT,SIGFPE,SIGILL,SIGINT,SIGSEGV,SIGTERM};
static void (*rets[])(int)={SIG_DFL,SIG_ERR,SIG_IGN};
static sig_atomic_t atomic;

static void field_fpe(int sig)
{
assert(sig==SIGFPE);
puts("success testing <signal.h>");
exit(EXIT_SUCCESS);
}

int main()
{
printf("sizeof (sig_atomic_t) = %u\n",sizeof(sig_atomic_t));
assert(signal(SIGFPE,&field_fpe)==SIG_DFL);  //signal設置SIGFPE信號發生后的處理函數並返回信號處理程序之前的值
assert(signal(SIGFPE,&field_fpe)==&field_fpe);  //判斷信號處理函數是否設置成功
raise(SIGFPE);  //發送SIGFPE信號
puts("fail testing <signal.h>");
return (EXIT_FAILURE);
}

執行結果:

sizeof (sig_atomic_t) = 4
success testing <signal.h>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM