1. 程式人生 > >linux 信號屏蔽

linux 信號屏蔽

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 信號屏蔽