1. 程式人生 > >信號處理函數(3)-sigaction() 為信號註冊信號捕捉函數

信號處理函數(3)-sigaction() 為信號註冊信號捕捉函數

捕捉 span flags 信號 printf struct body null gpo

定義:

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(int
num) { 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() 為信號註冊信號捕捉函數