C 庫 - raise() 函式



C 庫的 raise(sig) 函式會導致生成訊號 sigsig 引數與 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
廣告

© . All rights reserved.