void (*signal(int signo, void (*func)(int)))(int);
這是標準庫 `
int signo, void (*func)(int) // 即:int signo, Handler func
void (*signal(...))(int) // 讀法:signal(...) 返回一個指針,該指針指向「參數 int、返回 void」的函數
signal 是一個函數(非指針),其:
// 1. 定義信號處理函數類型 typedef void (*sig_handler_t)(int); // 2. signal 原型變得清晰可讀 sig_handler_t signal(int signo, sig_handler_t func);
#include <signal.h>
#include <stdio.h>
void my_handler(int sig) {
printf("捕獲信號 %d\n", sig);
}
int main() {
// 註冊 SIGINT (Ctrl+C) 處理函數,保存舊處理函數
void (*old_handler)(int) = signal(SIGINT, my_handler);
printf("按 Ctrl+C 測試...\n");
while (1) sleep(1);
// 恢復舊處理函數(示意)
// signal(SIGINT, old_handler);
return 0;
}
應用於 `void (*signal(int, void(*)(int)))(int)`:
signal // 標識符 signal( ) // 是函數,參數見括號內 signal(int, void(*)(int)) // 參數:int 和 函數指針 (*signal(...)) // 返回指針 void (*signal(...))(int) // 指向「參數 int、返回 void」的函數
`signal` 聲明雖長相嚇人,但結構清晰:函數接受信號號和處理器,返回舊處理器。掌握「從標識符螺旋展開」解讀法 + `typedef` 封裝,即可輕鬆應對所有複雜函數指針聲明。