首页 > 系统服务 > 详细

Linux-信号机制

时间:2014-03-15 18:04:10      阅读:599      评论:0      收藏:0      [点我收藏+]
/*
 * @ zwp
 */


#include <sys/types.h>
#include <sys/stat.h>
#include <signal.h>
#include <setjmp.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>


static void 		sig_usr1(int), sig_alrm(int);
static sigjmp_buf	jmpbuf;
static volatile		sig_atomic_t	canjump;



int main(int argc, char* agv[])
{

	if(signal(SIGUSR1, sig_usr1) == SIG_ERR)
		printf("signal (SIGUSR1) error...\n");
	if(signal(SIGALRM, sig_alrm) == SIG_ERR)
		printf("signal (SIGALRM) error....\n");
	
	pr_mask("starting main:	");
	
	if(sigsetjmp(jmpbuf, 1))
	{
		pr_mask("ending main: ");
		exit(0);
	}
	
	canjump = 1;
	
	for(; ;)
		pause();

}


static void sig_usr1(int signo)
{
	
	time_t	starttime;
	
	if(canjump == 0)
		return ;
	
	pr_mask("starting sig_usr1: ");
	
	alarm(3);
	starttime = time(NULL);
	for(; ;)
		if(time(NULL) > starttime + 5)
			break;

	pr_mask("finishing sig_usr1: ");
	canjump = 0;
	siglongjmp(jmpbuf, 1);
}


static void sig_alrm(int signo)
{
	pr_mask("in sig_alrm:  ");
	return ;

}


void pr_mask(const char *str)
{
	sigset_t	sigset;
	int		errno_save;
	
	errno_save = errno;
	if(sigprocmask(0, NULL, &sigset) < 0)
		printf("sigprocmask error...\n");
	
	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 ");
	
	printf("\n");
	errno = errno_save;
	
}






Linux-信号机制,布布扣,bubuko.com

Linux-信号机制

原文:http://blog.csdn.net/qqzwp/article/details/21291565

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!