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 引數必須是 SIGABRTSIGALLSIGILLSIGINTSIGFPESIGIOSIGTHERSIGSEGVSIGTERMSIGUSR1SIGUSR2(定義在 signal.h 併入檔中)。 只有 ILE C/C++ 執行時期檔案庫才支援 SIGALLSIGIOSIGOTHERFunc 引數必須是 <signal.h> 併入檔中定義的其中一個巨集 SIG_DFLSIG_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  */

相關資訊