LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1347|回复: 2

调用Socket接口时被信号中断的问题

[复制链接]
发表于 2007-11-12 17:04:22 | 显示全部楼层 |阅读模式
开发环境: linux2.6.21,  gcc3.4.5
开发语言:C++

在调用Socket接口(比如connect,recv,select等)的时候,总莫名其妙的被信号中断(通过返回值以及errno判断的,即返回值为-1,errno为4)。经过反复调试,最后查出是由于定时器造成的,但不明白为什么会与定时器使用有关。

定时器使用大致如下:
#define  SIGMYTIMER  (SIGRTMAX)

void TestCLass::InitializeTimer()
{
        struct sigaction sysact;
        sigemptyset(&sysact.sa_mask);
        sysact.sa_flags=SA_SIGINFO | SA_RESTART;
        sysact.sa_sigaction=TimerRoutine ;
        sigaction(SIGMYTIMER,&sysact,NULL);

        struct sigevent evp;
        evp.sigev_notify = SIGEV_SIGNAL;
        evp.sigev_signo = SIGMYTIMER;
        evp.sigev_value.sival_ptr = this;
        int nCreate = timer_create(CLOCK_REALTIME,&evp,&m_TimerID);

                struct itimerspec value;
                struct itimerspec ovalue;

                value.it_value.tv_sec = 0;
                value.it_value.tv_nsec = 10 * (1000 * 1000);
                value.it_interval.tv_sec = value.it_value.tv_sec;
                value.it_interval.tv_nsec = value.it_value.tv_nsec;

                timer_settime(m_TimerID,0,&value,&ovalue);
......
                return true;
}

当我把上述代码注释之后,再调用Socket的接口时就一切正常。
不知道大家遇到类似的问题没有?如何解决的呢?
用setitimer(ITIMER_REAL,...)也可以使用定时器功能,但那样又与usleep等函数冲突。遇到过类似问题的大虾指点一下!
thanks
发表于 2007-11-13 13:10:25 | 显示全部楼层
使用TEMP_FAILURE_RETRY()宏
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-13 13:59:44 | 显示全部楼层
我怎么没找到这个宏TEMP_FAILURE_RETRY?
在调用Socket接口的时候,如果被中断,可以不断反复重试,但这样改动太大了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表