Chinaunix首页 | 论坛 | 博客
  • 博客访问: 350155
  • 博文数量: 46
  • 博客积分: 4936
  • 博客等级: 上校
  • 技术积分: 575
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-25 20:14
文章分类

全部博文(46)

文章存档

2012年(4)

2011年(1)

2010年(23)

2009年(18)

分类: LINUX

2009-08-22 17:36:07

近期在调试epoll程序时发现用GDB时收不到消息,但是只执行程序是没有问题的,感觉很奇怪。经过输出日志的情况下跟踪程序,发现不是epoll的问题,而是信号量。上网一查发现这个问题确实存在,具体描述如下:
 
  不调试运行正常,一个线程sem_wait()等待别的线程执行sem_post(),但是  
  用gdb调试运行时,本应等待的线程执行了后面的代码导致错误。
 
原因是:在GDB调试环境下sem_wait()总是被触发,但是errno是EINTR(系统中断),这是需要屏蔽EINTR,具体操作代码是:
        int ret = 0;
        while (0 != (ret = sem_wait(&(_readyfds.sem_write))))               
        {                       
                if (errno == EINTR)
                        continue; 
                else
                     return -1;      
         }
这样就可以了。
阅读(2917) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-12-01 09:54:45

简化:while( ( sem_wait(&(_readyfds.sem_write)) != 0 ) && (errno == EINTR ) );