C庫 - signal() 函式



C庫的signal()函式允許使用者在程式執行期間處理非同步事件。非同步事件是指報告程式外部事件的軟體通知。例如:除以零、鍵盤中斷等。這裡,void(*signal(int sig, void (*func)(int))) (int) 設定一個函式來處理訊號,即使用訊號編號sig的訊號處理程式。

語法

以下是C庫signal()函式的語法:

void (*signal(int sig, void (*func)(int)))(int)

引數

  • sig - sig定義了構建處理函式的訊號。以下是重要的標準訊號編號列表:

序號 宏 & 訊號
1

SIGABRT

(訊號中止)異常終止,例如由函式啟動。

2

SIGFPE

(訊號浮點異常)錯誤的算術運算,例如零除或導致溢位的運算(不一定與浮點運算有關)。

3

SIGILL

(訊號非法指令)無效函式映像,例如非法指令。這通常是由於程式碼損壞或嘗試執行資料造成的。

4

SIGINT

(訊號中斷)互動式注意訊號。通常由應用程式使用者生成。

5

SIGSEGV

(訊號段錯誤)無效的儲存器訪問 - 當程式嘗試讀取或寫入其分配的記憶體之外的記憶體時。

6

SIGTERM

(訊號終止)傳送到程式的終止請求。

  • func - 這是一個指向函式的指標。這可以是程式設計師定義的函式,也可以是以下預定義函式之一:

序號 函式 & 描述
1

SIG_DFL

預設處理 - 訊號由該特定訊號的預設操作處理。

2

SIG_IGN

忽略訊號 - 訊號被忽略。

返回值

此函式返回訊號處理程式的先前值,或在出錯時返回SIG_ERR。

示例1

以下是一個基本的C庫程式,用於演示signal()函式。

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

void sighandler(int);

int main () {
   signal(SIGINT, sighandler);

   while(1) {
      printf("Going to sleep for a second...\n");
      sleep(1); 
   }
   return(0);
}

void sighandler(int signum) {
   printf("Caught signal %d, coming out...\n", signum);
   exit(1);
}

輸出

執行上述程式碼後,我們將產生以下結果,程式將進入無限迴圈。要退出程式,我們使用CTRL + C鍵。

Going to sleep for a second...
Going to sleep for a second...
Going to sleep for a second...
Going to sleep for a second...
Going to sleep for a second...
Caught signal 2, coming out...

示例2

在這個例子中,我們說明了忽略SIGINT訊號。

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

void handle_sigint(int signum) {
    printf("Received Ctrl+C, but ignoring it.\n");
}

int main() {
   // Press Ctrl+C to ignore (SIGINT)
   signal(SIGINT, SIG_IGN); 
   while (1) {
       printf("Press Ctrl+C (ignored)...\n");
       sleep(1);
    }
   return 0;
}

輸出

上述程式碼產生以下結果,程式將進入無限迴圈。要退出程式,請使用 CTRL + C 鍵。

Press Ctrl+C (ignored)...
Press Ctrl+C (ignored)...
Press Ctrl+C (ignored)...
Press Ctrl+C (ignored)...
^CPress Ctrl+C (ignored)...

示例3

在這個例子中,我們使用訊號SIGTERM來請求程式終止。

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

void sig_handler(int signum) {
   printf("Received SIGTERM. Exiting gracefully...\n");
   // Perform cleanup or other necessary actions before exiting
   _exit(0);
}

int main() {
   // Set custom signal handler for SIGTERM
   signal(SIGTERM, sig_handler); 
   while (1) {
       printf("Press Ctrl+C to send SIGTERM...\n");
       sleep(1);
    }
   return 0;
}

輸出

執行程式碼後,我們得到以下結果:

Press Ctrl+C to send SIGTERM...
Press Ctrl+C to send SIGTERM...
Press Ctrl+C to send SIGTERM...
Press Ctrl+C to send SIGTERM...
^C

Advertisements
© . All rights reserved.