void (*signal(int signo, void (*func)(int)))(int);
func:處理函數,參數為信號編號,回傳 voidSIG_IGN (忽略)、SIG_DFL (預設動作)SIG_ERRvoid handler(int sig) { puts("Signal caught"); }
signal(SIGINT, handler);
int sigaction(int signo, const struct sigaction *act, struct sigaction *oldact);
struct sigaction {
void (*sa_handler)(int); // 一般處理函數
void (*sa_sigaction)(int, siginfo_t*, void*); // 擴充處理函數
sigset_t sa_mask; // 執行處理函數時阻塞的信號
int sa_flags; // 行為旗標
};
| 旗標 | 效果 |
|---|---|
| SA_NOCLDSTOP | SIGCHLD:僅子進程結束產生,停止不產生 |
| SA_NOCLDWAIT | SIGCHLD:避免殭屍進程 |
| SA_NODEFER / SA_NOMASK | 處理函數執行時不阻塞自身信號 |
| SA_ONESHOT / SA_RESETHAND | 執行一次後重置為預設動作 |
| SA_RESTART | 被中斷的系統呼叫自動重啟 |
| SA_SIGINFO | 使用 sa_sigaction 而非 sa_handler |
struct sigaction act = {0};
act.sa_handler = handler;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
sigaction(SIGINT, &act, NULL);
| 特性 | signal | sigaction |
|---|---|---|
| 可攜性 | ANSI C | POSIX.1 |
| 信號遮罩控制 | 無 | sa_mask 精確控制 |
| 旗標控制 | 無 | 多種行為旗標 |
| 擴充資訊 | 無 | sa_sigaction + siginfo_t |
| 推薦度 | 簡單場合 | 生產環境/複雜需求 |
sigaction 可完全取代 signal,建議新專案優先使用。