- C 標準庫
- C 庫 - 首頁
- C 庫 - <assert.h>
- C 庫 - <complex.h>
- C 庫 - <ctype.h>
- C 庫 - <errno.h>
- C 庫 - <fenv.h>
- C 庫 - <float.h>
- C 庫 - <inttypes.h>
- C 庫 - <iso646.h>
- C 庫 - <limits.h>
- C 庫 - <locale.h>
- C 庫 - <math.h>
- C 庫 - <setjmp.h>
- C 庫 - <signal.h>
- C 庫 - <stdalign.h>
- C 庫 - <stdarg.h>
- C 庫 - <stdbool.h>
- C 庫 - <stddef.h>
- C 庫 - <stdio.h>
- C 庫 - <stdlib.h>
- C 庫 - <string.h>
- C 庫 - <tgmath.h>
- C 庫 - <time.h>
- C 庫 - <wctype.h>
- C 標準庫資源
- C 庫 - 快速指南
- C 庫 - 有用資源
- C 庫 - 討論
- C 程式設計資源
- C 程式設計 - 教程
- C - 有用資源
C 庫 - raise() 函式
C 庫的 raise(sig) 函式會導致生成訊號 sig。sig 引數與 SIG 宏相容。
兩種型別的訊號處理:
- 測試訊號處理:在這種訊號處理中,我們使用 raise() 來檢查訊號處理程式是否對特定訊號正確響應。
- 自定義訊號處理:如果使用者希望使用 signal() 函式設定自定義訊號處理,那麼我們可以使用 raise() 函式顯式呼叫處理程式。
語法
以下是 C 庫 raise() 函式的語法:
int raise(int sig)
引數
此函式僅接受一個訊號引數:
sig - 這是要傳送的訊號編號。以下是一些重要的標準訊號常量:
| 序號 | 宏 & 訊號 |
|---|---|
| 1 |
SIGABRT (訊號中止) 由 abort 函式發起的異常終止。 |
| 2 |
SIGFPE (訊號浮點異常) 錯誤的算術運算,例如零除或導致溢位的運算(不一定與浮點運算相關)。 |
| 3 |
SIGILL (訊號非法指令) 無效的函式映像,例如非法指令。這通常是由於程式碼損壞或嘗試執行資料造成的。 |
| 4 |
SIGINT (訊號中斷) 互動式注意訊號。通常由應用程式使用者生成。 |
| 5 |
SIGSEGV (訊號段錯誤) 無效的儲存器訪問 - 當程式嘗試讀取或寫入超出分配給它的記憶體時。 |
| 6 |
SIGTERM (訊號終止) 傳送到程式的終止請求。 |
返回值
如果函式成功,則返回零;否則返回非零值。
示例 1
在此示例中,我們使用 C 庫 raise() 函式來演示其用法。
#include <signal.h>
#include <stdio.h>
void signal_catchfunc(int);
int main () {
int ret;
ret = signal(SIGINT, signal_catchfunc);
if( ret == SIG_ERR) {
printf("Error: unable to set signal handler.\n");
exit(0);
}
printf("Going to raise a signal\n");
ret = raise(SIGINT);
if( ret !=0 ) {
printf("Error: unable to raise SIGINT signal.\n");
exit(0);
}
printf("Exiting...\n");
return(0);
}
void signal_catchfunc(int signal) {
printf("!! signal caught !!\n");
}
輸出
以上程式碼產生以下結果:
Going to raise a signal !! signal caught !! Exiting...
示例 2
在此示例中,我們使用 signal() 和 raise() 函式說明了訊號接收方和傳送方。
#include <signal.h>
#include <stdio.h>
void handler(int sig) {
// Signal receiver
printf("Signal received : %d\n", sig);
}
int main() {
signal(SIGILL, handler);
// Signal sender
printf("Signal Sended : %d\n", SIGILL);
raise(SIGILL);
return 0;
}
輸出
執行以上程式碼後,我們將獲得以下結果:
Signal Sended : 4 Signal received : 4
廣告