近期在调试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;
}
这样就可以了。
阅读(3000) | 评论(1) | 转发(0) |