signal ()- 處理岔斷信號
格式
#include <signal.h>
void ( *signal (int sig, void(*func)(int)) )(int);語言層次
ANSI
安全執行緒
是
說明
signal() 函數可讓程式選擇數種方式之一,以處理來自作業系統或 raise() 函數的岔斷信號。 如果使用 SYSIFCOPT (*ASYNCSIGNAL) 選項編譯,則此函數會使用非同步信號。 此函數的非同步版本行為與具有 SA_NODEFER 及 SA_RESETHAND 選項的 sigaction() 類似。 非同步信號處理程式可能不會呼叫 abort() 或 exit()。 此函數說明的其餘部分將說明同步信號。
sig 引數必須是 SIGABRT、 SIGALL、 SIGILL、 SIGINT、 SIGFPE、 SIGIO、 SIGTHER、 SIGSEGV、 SIGTERM、 SIGUSR1或 SIGUSR2(定義在 signal.h 併入檔中)。 只有 ILE C/C++ 執行時期檔案庫才支援 SIGALL、 SIGIO及 SIGOTHER 。 Func 引數必須是 <signal.h> 併入檔中定義的其中一個巨集 SIG_DFL 或 SIG_IGN,或函數位址。
sig 值的意義如下:
- Value
- 意義
- SIGABRT
- 異常終止 (abnormal termination)
- 註冊
- 適用於其現行處理動作為 SIG_DFL 的信號的 catch-all。
當指定 SYSIFCOPT (*ASYNCSIGNAL) 時, SIGALL 不是 catch-all 信號。 SIGALL 的信號處理程式只會針對使用者發出的 SIGALL 信號呼叫。
- SIGILL
- 偵測無效的函數影像
- SIGFPE
- 未遮罩的算術異常狀況,例如溢位、除以零,以及無效的作業
- SIGINT
- 互動式注意
- SIGIO
- 記錄檔 I/O 錯誤
- SIGOTHER
- ILE C 信號
- SIGSEGV
- 存取無效的記憶體
- SIGTERM
- 傳送至程式的結束要求
- SIGUSR1
- 預期供使用者應用程式使用。 (ANSI 的延伸)
- SIGUSR2
- 預期供使用者應用程式使用。 (ANSI 的延伸)
收到岔斷信號時所採取的動作取決於 func的值。
- Value
- 意義
- SIG_DFL
- 信號的預設處理將會發生。
- SIG_IGN
- 要忽略信號。
回覆值
回覆值 SIG_ERR 表示呼叫 signal()時發生錯誤。 如果成功,則呼叫 signal() 會傳回 func的最新值。 錯誤碼的值可能設為 EINVAL (信號無效)。
範例
此範例顯示如何建立信號處理程式。
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#define ONE_K 1024
#define OUT_OF_STORAGE (SIGUSR1)
/* The SIGNAL macro does a signal() checking the return code */
#define SIGNAL(SIG, StrCln) { \
if (signal((SIG), (StrCln)) == SIG_ERR) { \
perror("Could not signal user signal"); \
abort(); \
} \
}
void StrCln(int);
void DoWork(char **, int);
int main(int argc, char *argv[]) {
int size;
char *buffer;
SIGNAL(OUT_OF_STORAGE, StrCln);
if (argc != 2) {
printf("Syntax: %s size \n", argv[0]);
return(-1);
}
size = atoi(argv[1]);
DoWork(&buffer, size);
return(0);
}
void StrCln(int SIG_TYPE) {
printf("Failed trying to malloc storage\n");
SIGNAL(SIG_TYPE, SIG_DFL);
exit(0);
}
void DoWork(char **buffer, int size) {
int rc;
*buffer = malloc(size*ONE_K); /* get the size in number of K */
if (*buffer == NULL) {
if (raise(OUT_OF_STORAGE)) {
perror("Could not raise user signal");
abort();
}
}
return;
}
/* This is a program fragment and not a complete function example */
相關資訊
- abort ()-停止程式
- atexit ()-記錄程式結束函數
- exit ()-結束程式
- raise ()-傳送信號
- <signal.h>
- 「資訊中心」內 API 主題中的 signal () API。