java sigquit_程序捕获退出信号(SIGINT,SIGQUIT,SIGTERM)

static volatile sig_atomic_t g_sigreceived=0;

void sig_handler(int signo)

{

printf("signo=%d\n", signo);

if(signo==SIGINT || signo==SIGQUIT || signo==SIGTERM)

{

g_sigreceived=1;

}

}

//功能:等待某个信号返回且不阻塞其它信号

void WaitSingSigAndNoBlockOthers(void)

{

struct sigaction newact,oldact;

sigset_t maskblocked,oldmask;

// set cur handler,save previous information

newact.sa_handler=sig_handler;

sigemptyset(&newact.sa_mask);

newact.sa_flags=0;

// block SIGINT and save current signal mask

sigprocmask(SIG_SETMASK,NULL,&maskblocked);

sigaddset(&maskblocked,SIGINT);

sigprocmask(SIG_BLOCK,&maskblocked,&oldmask);

sigaction(SIGINT,&newact,&oldact);

sigdelset(&maskblocked,SIGINT);

sigaddset(&maskblocked,SIGTERM);

sigprocmask(SIG_BLOCK,&maskblocked,&oldmask);

sigaction(SIGTERM,&newact,&oldact);

sigdelset(&maskblocked,SIGTERM);

sigaddset(&maskblocked,SIGQUIT);

sigprocmask(SIG_BLOCK,&maskblocked,&oldmask);

sigaction(SIGHUP,&newact,&oldact);

sigdelset(&maskblocked,SIGQUIT);

while(g_sigreceived==0)

sigsuspend(&maskblocked);

printf("wait SIGINT ok!\n");

sigprocmask(SIG_SETMASK,&oldmask,NULL);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值