信號處理函數(3)-sigaction() 為信號註冊信號捕捉函數
定義:
int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact);
表頭文件:
#include<signal.h>
說明:
sigaction()會依參數signum指定的信號編號來設置該信號的處理函數。參數signum可以指定SIGKILL和SIGSTOP以外的所有信號。
如參數結構sigaction定義如下
struct sigaction
{
void (*sa_handler) (int);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer) (void);
}
sa_handler: 函數指針,指定當信號到來時由哪個函數來處理,函數原型為 void foo(int);
sa_mask: 臨時屏蔽字,在處理信號時,屏蔽哪些信號。
sa_flags 用來設置信號處理的其他相關操作, 可設置為0
返回值:
執行成功則返回0, 如果有錯誤則返回-1。
示例:
#include <stdio.h> #include <unistd.h> #include <signal.h> void recv_sig(intnum) { int n = 5; printf("I have received a signal\n"); while(n--) { printf("num = %d\n", num); sleep(1); } } int main() { struct sigaction act; act.sa_handler = recv_sig; sigemptyset(&act.sa_mask); // 當處理SIGUSR1信號時,暫時屏蔽SIGQUIT信號 sigaddset(&act.sa_mask, SIGQUIT); act.sa_flags= 0; sigaction(SIGUSR1, &act, NULL); while(1) { printf("*************\n"); sleep(1); } return 0; }
運行結果:
yongdaimi@iMac:~/Documents/code$ ./app
*************
*************
*************
*************
*************
*************
*************
*************
*************
*************
*************
*************
*************
*************
*************
I have received a signal
num = 10
num = 10
num = 10
^\num = 10
num = 10
退出 (核心已轉儲)
信號處理函數(3)-sigaction() 為信號註冊信號捕捉函數