我是靠谱客的博主 安静面包,这篇文章主要介绍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).这里说了.确实会被唤醒.没办法只能该程序忽略这个信号

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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 ackn"); sem_destroy(wSem); return 0; } else { if(errno == ETIMEDOUT) { printf("sem timoutn"); sem_destroy(wSem); return -1; } // else if(errno == EINTR) // { // continue;//忽略其它signal信号 // } } } }



最后

以上就是安静面包最近收集整理的关于sem_timedwait 会被signal的信号唤醒及处理办法的全部内容,更多相关sem_timedwait内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部