[unix]sigsuspend函数保护代码临界区 使其不被特定信号中断

6 篇文章 0 订阅
6 篇文章 0 订阅
#include <apue.h>
#include <errno.h>
/**
 * 1 保护代码临界区 使其不被特定信号中断
 * 2 当sigsuspend返回时 它将信号屏蔽字设置为调用它之前当值
 * SIGINT信号将被阻塞。因此将信号屏蔽恢复为之前保存当值oldmask
 * 3 在调用sigsuspend时 将SIGUSR1信号加到了进程号屏蔽字中,
 * 所以当运行该信号处理程序时,得知信号屏蔽字已改变。可见,在
 * sigsuspend返回时,它将信号屏蔽字恢复为调用它之前当值
 */

static void sig_int(int);
void pr_mask(const char *);


int main(void)
{
	sigset_t newmask,oldmask,waitmask;

	pr_mask("program start: ");

	if(signal(SIGINT,sig_int) == SIG_ERR)
		err_sys("signal(SIGINT) error!");
	sigemptyset(&waitmask);
	sigaddset(&waitmask,SIGUSR1);
	sigemptyset(&newmask);
	sigaddset(&newmask,SIGINT);
	/**
	 * Block SIGINT and save current signal mask
	 */

	if(sigprocmask(SIG_BLOCK,&newmask,&oldmask) < 0)
		err_sys("SIG_BLOCK error");

	/**
	 * Critical region of code
	 */

	pr_mask("in critical region: ");

	/**
	 * Pause, allowing all signals except SIGUSR1
	 */

	if(sigsuspend(&waitmask) != -1)
		err_sys("sigsuspend error");

	pr_mask("after return from sigsuspend: ");

	/**
	 * Reset signal mask which unblocks SIGINT
	 */

	if(sigprocmask(SIG_SETMASK,&oldmask,NULL) < 0)
		err_sys("SIG_SETMASK error");

	/**
	 * And continue processing ...
	 */

	pr_mask("program exit: ");

	exit(0);
}

static void sig_int(int signo)
{
	pr_mask("\nin sig_int: ");
}

void pr_mask(const char *str)
{
	sigset_t sigset;
	int errno_save;
	errno_save  = errno;
	if(sigprocmask(0,NULL,&sigset) < 0){
		err_ret("sigprocmask error!");
	}else{
		printf("%s",str);
		if(sigismember(&sigset,SIGINT))
			printf(" SIGINT");
		if(sigismember(&sigset,SIGQUIT))
			printf(" SIGQUIT");
		if(sigismember(&sigset,SIGUSR1))
			printf(" SIGUSR1");
		if(sigismember(&sigset,SIGALRM))
			printf(" SIGALRM");

		/* REMAINING SIGNALS CAN GO HERR */

		printf("\n");

	}

	errno = errno_save;  /* restore errno */
}


学无止境不耻下问:http://includestdio.com

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值