- 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庫 - 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... ^CAdvertisements