Linux 使用sigaction查询或设置信号处理方式
生活随笔
收集整理的這篇文章主要介紹了
Linux 使用sigaction查询或设置信号处理方式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、概述
Linux的系統調用函數sigaction()可以用來查詢或設置信號處理方式。
函數聲明為:
#include <signal.h>int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);如果執行成功返回0,否則返回-1。其中,參數表示的含義如下:
- signum:要操作的信號,指定除SIGKILL和SIGSTOP以外其所有信號。?
- act:要設置的對信號的新處理方式,sigaction指針結構體
- oldact:原來對信號的處理方式
結構體struct sigaction描述對信號的處理,定義如下:
struct sigaction {void (*sa_handler)(int);void (*sa_sigaction)(int,siginfo_t *,void *);sigset_t sa_mask;int sa_flags;void (*sa_restorer)(void); }在sigaction結構體中,參數表述如下:
- sa_handler:函數指針,指向一個信號處理函數
- sa_sigaction:獲得關于信號的更詳細信息
- sa_flags:成員的值包含SA_SIGINFO時,系統將使用sa_sigaction函數作為信號處理函數,否則使用sa_handler
- sa_mask:用來指定在信號處理函數執行期間需要被屏蔽的信號,信號自身會被自動放入進程的信號掩碼,不會重復執行
sa_flags成員用于指定信號的處理行為,它可以是以下值的“按位或”組合。
- SA_RESTART:使被信號打斷的系統調用自動重新發起
- SA_NOCLDSTOP:使父進程在它的子進程暫停或繼續運行時不會收到SIGCHLD信號
- SA_NOCLDWAIT:使父進程在它的子進程退出時不會收到SIGCHLD信號,這時子進程如果也退出,也不會成為僵尸進程
- SA_NODEFER:使對信號的屏蔽無效,即在信號處理函數執行期間,仍能發出這個信號
- SA_RESETHAND:信號處理之后重新設置為默認的處理方式
- SA_SIGINFO:使用sa_sigaction作為默認的信號處理函數
二、sigaction使用示例
#include <stdio.h> #include <unistd.h> #include <signal.h>static void sig_usr(int signum) {if(signum == SIGUSR1){printf("SIGUSR1 received \n");}else{printf("signal %d received\n",signum);} } int main(void) {struct sigaction sa_usr;sa_usr.sa_flags = 0;sa_usr.sa_handler = sig_usr;//管理信號處理函數sigcation(SIGUSR1,&sa_usr,NULL);//注冊信號處理方式printf("PID = %d\n",getpid());//打印當前進程pidwhile(1){//等待外部kill 當前進程}return 0; }保存文件,編譯當前文件并執行:
# g++ testMysigcation.cpp -o run # ./run PID = 42273現在打開另一個終端,用kill發送命令:
# kill -USR1 42273SIGUSR1 received可見sig_usr接收到了發送的信號,并正確打印了結果。sigaction注冊信號處理函數時,不會自動重新發起被信號打斷的系統調用。
------分享知識,讓人愉悅,原創博文,支持請點贊。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Linux 使用sigaction查询或设置信号处理方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: lpr命令linux下未找到,linux
- 下一篇: 江湖情缘1.76-180-185三合一版