linux 信號屏蔽
阿新 • • 發佈:2018-03-18
file trac 獲取 cli proc ctrl+ static sdn cau
<span style="font-size:18px;">#include <sys/types.h> #include <unistd.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> /* sigemptyset(&newmask);//獲取空屏蔽信號集 sigfillset(&newmask);//獲取屏蔽了全部信號的屏蔽信號集。除了那兩個SIGKILL SIGSTOP sigpending(&pendmask);//獲取進程中當前的屏蔽信號集 sigaddset(&newmask, SIGQUIT);//往空屏蔽信號集增加SIGQUIT (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)//並集 (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)//設置會原來的屏蔽信號集 (sigismember(&fillmask, SIGQUIT))//推斷SIGQUIT是否在當前的屏蔽信號集中 */ static void sig_quit(int); int main(void) { sigset_t newmask, oldmask, pendmask,fillmask; if (signal(SIGQUIT, sig_quit) == SIG_ERR)//設置信號處理函數 perror("can‘t catch SIGQUIT"); /* * Block SIGQUIT and save current signal mask. */ sigemptyset(&newmask);//獲取空屏蔽信號集 sigaddset(&newmask, SIGQUIT);//往空屏蔽信號集增加SIGQUIT if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)//並集 perror("SIG_BLOCK error"); sleep(5); /* SIGQUIT here will remain pending */ //睡眠期間按下多次 ctrl+\ 未決信號集中之保留一次 if (sigpending(&pendmask) < 0)//獲取進程中當前的屏蔽信號集 perror("sigpending error"); if (sigismember(&pendmask, SIGQUIT))//推斷SIGQUIT是否在當前的屏蔽信號集中 printf("\nSIGQUIT pending\n"); /* * Restore signal mask which unblocks SIGQUIT. */ if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)//設置會原來的屏蔽信號集。因為SIGQUIT保留著一個未決信號,所以這裏觸發了信號處理函數,SIGQUIT變回默認處理 perror("SIG_SETMASK error"); printf("SIGQUIT unblocked\n"); sleep(5); /* SIGQUIT here will terminate with core file */ //在此期間按下 ctrl+\ 運行信號處理函數 ,調用默認處理。game over! printf("fillmask test\n"); if (sigfillset(&fillmask) < 0)//獲取屏蔽了全部信號的屏蔽信號集,除了那兩個SIGKILL SIGSTOP perror("sigfillset error\n"); if (sigismember(&fillmask, SIGQUIT))//推斷SIGQUIT是否在當前的屏蔽信號集中 printf("\nSIGQUIT pending\n");//在 if (sigprocmask(SIG_SETMASK,&fillmask , &oldmask) < 0)//設置屏蔽全部 perror("fillmask error\n"); sleep(5); if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)//假設在fillmask測試期間有按下ctrl+\。則以下不會睡眠5秒了。運行了SIGQUIT的默認處理函數 perror("SIG_SETMASK error\n"); sleep(5); exit(0); } static void sig_quit(int signo) { printf("caught SIGQUIT\n"); //if (signal(SIGQUIT, SIG_DFL) == SIG_ERR) // perror("can‘t reset SIGQUIT"); } </span>
linux 信號屏蔽