免费注册 查看新帖 |

Chinaunix

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

signal问题,SIGTERM被忽略? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-05 16:43 |只看该作者 |倒序浏览
我发送SIGTERM,但是总不跳出循环,不知为什么,大虾们请看看。。。

static sig_atomic_t graceful_quit = 0;

void terminate(int signum)
{
    INFO_LOG("Received signal %s, Terminate the ptRouter program"\
             " gracefully..", strsignal(signum));
    graceful_quit = 1;
    return;  
}

int main(int argc, char **argv)
{
   int fifo_ctrl, fifo_data;
   int recvnum = 0;
   struct dlog_msg dmsg;
   char buff[MAXLINE];
  
  
   // Open control fifo
   if ((mkfifo(DLOG_FIFO_ROUTER_CTRL,0666) == -1) && (errno != EEXIST))
    {
      CRIT_LOG("dlog_create mkfifo fail: %m (%d)",errno);   
      exit(1);
    }
    if ((fifo_ctrl = open(DLOG_FIFO_ROUTER_CTRL,O_NONBLOCK | O_RDWR)) == -1)
    {
      CRIT_LOG("dlog_create fifo open fail: %m (%d)",errno);
      exit(1);
    }
   
     DEBUG_LOG("conrtol fifo opened");
   
    // Open data fifo
    if ((mkfifo(DLOG_FIFO_ROUTER_DATA,0666) == -1) && (errno != EEXIST))
    {
      CRIT_LOG("dlog_create mkfifo fail: %m (%d)",errno);   
      exit(1);
    }
   
    if ((fifo_data = open(DLOG_FIFO_ROUTER_DATA, O_RDWR)) == -1)
    {
      CRIT_LOG("dlog_create fifo open fail: %m (%d)",errno);
      exit(1);
    }
          
    if (signal(SIGTERM, terminate) == SIG_ERR)
    {
              CRIT_LOG("Unable to install the new signal handler for signal %s\n",
                 strsignal(SIGTERM));
       exit(1);
    }
   
    DEBUG_LOG("message send to ptSession");
    while ((recvnum = read(fifo_data,buff,MAXLINE)) > 0)
    {
              DEBUG_LOG("message from ptSession %d", recvnum);
              
              if (graceful_quit)
              {
             DEBUG_LOG("Terminate gracefully");
             break;
        }
        
        int retStatus = 0;
        
        retStatus = write(STDOUTPUT, buff, recvnum);

        if (retStatus == -1)
        {
            CRIT_LOG("Write to stdout failed %d", errno);
            break;
        }
    }
   
  
    return 0;
}

论坛徽章:
0
2 [报告]
发表于 2009-01-05 16:58 |只看该作者

回复 #1 leo314034 的帖子

不好意思,又看了一下, 应该是由于read阻塞了,运行 不好break那里,不知道有没有更好的写法

  while ((recvnum = read(fifo_data,buff,MAXLINE)) > 0)
    {
              DEBUG_LOG("message from ptSession %d", recvnum);
              
              if (graceful_quit)
              {
             DEBUG_LOG("Terminate gracefully");
             break;
        }

论坛徽章:
0
3 [报告]
发表于 2009-01-05 17:05 |只看该作者

回复 #1 leo314034 的帖子

不好意思,刚刚晕了,只要把graceful_quit移上去就可以了

论坛徽章:
0
4 [报告]
发表于 2009-01-05 17:41 |只看该作者
好像还是不行,我有晕了。。。

论坛徽章:
0
5 [报告]
发表于 2009-01-05 18:21 |只看该作者
看看系统调用是否是中断后自动重启动的。

另外,这样方法怎么都有可能造成永远阻塞。

论坛徽章:
0
6 [报告]
发表于 2009-01-10 14:51 |只看该作者
建议楼主用SELECT函数,这样可以在SELECT函数超时的时候检查FLAG

论坛徽章:
0
7 [报告]
发表于 2009-01-10 14:58 |只看该作者
while  循环可改为如下
while(!graceful_quit )
{
   FD_ZERO(&rfds);
   FD_SET(fifo_data, &rfds);
   tv.tv_sec = 1;
   ret = select(fifo_data+1, &rfds, NULL, NULL, &tv);
    if(ret < 0)
    {
        if(EINTR == errno)
              continue;
        break;
    }
    if(0 == ret)
        continue;

    recvnum = read(fifo_data,buff,MAXLINE);
   ....
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP