C 語言中的錯誤處理 -- raise & signal

高等 C 語言

簡介

字串

指標與陣列

函數

結構

物件導向

記憶體

檔案

錯誤處理

巨集處理

C 與組合語言

資料結構

動態字串

動態陣列

鏈結串列

雜湊表

開發環境

Make

Cygwin

MinGW

DevC++

wxDevC++

編譯器

gcc 編譯器

TinyCC 編譯器

LCC 編譯器

應用主題

CGI 程式

GNU 程式

視窗程式

影像處理

練習題

訊息

相關網站

參考文獻

最新修改

簡體版

English

說明

現今的電腦 CPU 通常在發生錯誤時會引發中斷,這些中斷訊息被稱為訊號 (Signal)。中斷可分為兩類,軟體中斷與硬體中斷,硬體中斷像是鍵盤中斷、滑鼠中斷、時間中斷等,而軟體中斷則是像 80x86 中的 int 10h 等。

對於一般程式不會處理的中斷訊號,像是在 UNIX 或 DOS 系統裡鍵入 Ctrl-C、分段錯誤、浮點錯誤 (除以 0 或 overflow) 等,我們可以在 C 語言中使用 signal 指定該訊號的處理程序。

以下是 C 語言中所定義的一些中斷訊號,

SIG_DFL     預設中斷 (default handler)
SIG_ERR     錯誤訊號 (signal error)
SIG_IGN     忽視訊號 (signal ignore)
SIGABRT     不正常中止 (abnormal termination),由 abort() 函數所引發
SIGFPE     浮點運算錯誤 (floating-point error),除以零、溢位等不正常運算).
SIGILL     非法操作 (illegal operation),非法指令,例如在使用者模式執行特權指令.
SIGINT     交談式中斷訊號 (interactive attention signal),像是 Ctrl-C.
SIGSEGV     非法存取儲存體 (invalid access to storage:segment violation, memory violation),
                 例如存取該程式以外的記憶空間,造成非法存取的情況。
SIGTERM     終止請求 (termination request)。

另外,當我們希望引發某種訊號,以強制程式中斷時,可以利用 raise 函數,引發軟體中斷。以下我們利用程式示範 C 語言中的 signal 與 raise 函數之用法。

程式範例:raise.c

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

void catch_function(int);

int main(void) {
  if(signal(SIGINT, catch_function)==SIG_ERR){
    printf("signal(SIGINT, catch_function) fail!\n");
    exit(0);
  }

  printf("raise(SIGINT)\n");
  if(raise(SIGINT)!=0) {
    printf("raise(SIGINT) fail !\n");
    exit(0);
  }
  printf("return\n");
  return 0;
}

void catch_function(int signal) {
  printf("catch error!\n");
}

執行結果

D:\cp>gcc raise.c -o raise

D:\cp>raise
raise(SIGINT)
catch error!
return

Facebook

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License