Linux-信号机制

/*
 * @ 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-信号机制,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。