sem_timedwait 会被signal的信号唤醒及处理办法

一直都在使用sem_timedwait 函数用来处理超时等待应答.但是突然发现 没有收到应答.竟然返回了.查了半天竟然是signal(SIGALRM, ....)的原因.man 了一下 sem_timedwait 

RETURN VALUE
       All of these functions return 0 on success; on error, the value of  the
       semaphore  is left unchanged, -1 is returned, and errno is set to indi‐
       cate the error.

ERRORS
       EINTR  The call was interrupted by a signal handler; see signal(7).这里说了.确实会被唤醒.没办法只能该程序忽略这个信号

int  _wait_sem( int  sec, char *pack_str_t)
{
    struct timespec ts;
    int sts;
	sem_t *wSem;
	
	wSem = &jf2414_acksem;

	p_ack_str = pack_str_t;
    ts.tv_sec = time(0) + sec;   //important
    ts.tv_nsec = 0;

    /* Try to lock Semaphore */
    sem_init (wSem, 0, 0);//set sem is 0
	while ( 1 )
	{
	    sts = sem_timedwait(wSem, &ts);
	    if(sts == 0)
		{
	        printf("rec ack\n");
	        sem_destroy(wSem);
	        return 0;
	    }
	    else
		{
			if(errno == ETIMEDOUT)
			{
				printf("sem timout\n");
				sem_destroy(wSem);
				return -1;
			}
//			else if(errno == EINTR)
//			{
//				continue;//忽略其它signal信号
//			}
		}
	}
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值