免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2613 | 回复: 1
打印 上一主题 下一主题

关于select()与SIGTERM的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-30 21:29 |只看该作者 |倒序浏览
类似于下面的一个程序,如果select中有bad file discriptor的话,select会立即,如果此时给SIGTERM的话,会捕捉不到这个信号用自定义的处理函数处理?我自己写的test小程序会捕捉,可是下面这段却不会,不知道何故?

void terminate(int signum)

{
  if (signum == SIGTERM)
  {
    INFO_LOG("Terminate the cmnDispatcher program gracefully..";
    graceful_quit = 1;
  }
}

int Dispatcher::listen()
{
    INFO_LOG("Entering Dispatcher::listen";

    bool activityOccured;

    // Add signal SIGTERM handler here for collecting gcoverage data purpose
    std::signal(SIGTERM, terminate);

    // main forever loop
    for(;
    {
    activityOccured = false;
    struct timeval idleTimeout = {0, 0};

    if(  cmnTickManager_s.pendingTicks()  ¦ ¦
         cmnAsyncCallbackMgr_s.haveCallbacksToProcess()
         )
    {
        // Want to timeout right away
        idleTimeout.tv_sec = 0;
    }
    else
    {
        idleTimeout.tv_sec = idleTimeout_m;
    }

    refreshFdSets();

    // Refresh maxFd_m
    maxFd_m = getMaxFd();

    int rc = select(
        maxFd_m + 1,
        readFdMinder_m.fdSetToMonitor(),
        writeFdMinder_m.fdSetToMonitor(),
        exceptionFdMinder_m.fdSetToMonitor(),
        &idleTimeout
        );

    if( rc > 0)
    {
        // Got something on a socket, dispatch to Fd minders
        eventCount_m ++;
        activityOccured = true;

        readFdMinder_m.handleEvent();
        writeFdMinder_m.handleEvent();
        exceptionFdMinder_m.handleEvent();

    }
    else if( rc  < 0 )
    {
        // interruptions may be a timer or other signal
        // don't fail just fallthrough
        if (errno != EINTR)
        {
            // Not a signal...not expected
            CRIT_LOG("Dispatcher select error: %d %s ", errno, strerror(errno));
        }
    }
    else if ( rc ==0 )
    {
         CRIT_LOG("----leo----time out for select-----";
    }
     
  
    if (cmnTickManager_s.pendingTicks())
    {
        activityOccured = cmnTickManager_s.tick();
    }

    if( cmnAsyncCallbackMgr_s.haveCallbacksToProcess() )
    {
        //printf("Dispatcher - calling async\n";
        activityOccured = true;
        cmnAsyncCallbackMgr_s.processCallbacks();
    }

    if( !activityOccured )
    {
        notifyIdleTimeClients();
    }

    if ( shuttingDown_m  &brvbar; &brvbar; (graceful_quit == 1) ) { INFO_LOG("Exiting Dispatcher::listen\n"; return 0;  }

    }// for(;
    return 0;

}//listen

论坛徽章:
0
2 [报告]
发表于 2008-03-31 10:28 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP