编程札记

看下面的程序你是否会发现错误?如果没有发现那么说明你也会犯同样的错误!!!
while (1) //循环读取数据
{
  fprintf( stdout,"epoll wait...\n");
  int nfds = epoll_wait( epollfd, events, 2, -1 );
  for( i=0; i< nfds; i++ )
  {
    if( events[i].data.fd == fd )
        if( (nread = read(fd, buff, 255 )) > 0 )
        {
           fprintf( stdout,"dug com receive data!\n");
           fprintf( stdout,"len = %d\ndata :",nread);

           for(j=0;j<nread;j++) fprintf(stdout,"%02x ",buff[j]);
           fprintf(stdout,"\n" );
           write( fd2 , buff ,nread );
        }
      else if( events[i].data.fd == fd2 )
          if( (nread = read(fd2, buff,255)) > 0 )
          {
          fprintf( stdout,"down com receive data!\n");
          fprintf( stdout,"len = %d\ndata :",nread);
     
             for(j=0;j<nread;j++) fprintf(stdout,"%02x ",buff[j]);
             fprintf(stdout,"\n" );
             write( fd, buff, nread );
          }
    }
 }
上例中,本意是  events[i].data.fd == fd  时执行if( (nread = read(fd, buff, 255 )) > 0 );

而当 events[i].data.fd == fd2 时执行if( (nread = read(fd2, buff,255)) > 0 );
但是因为
 if( events[i].data.fd == fd )
  if( (nread = read(fd, buff, 255 )) > 0 )
  {
   。。。。
  }
这个语句块缺失一对{},所以,在逻辑上偏离的程序的原意,变成了如下逻辑:
 if( events[i].data.fd == fd )
 {
  if( (nread = read(fd, buff, 255 )) > 0 )
  {
   。。。。
  }
  else if( events[i].data.fd == fd2 )
  {
   if( (nread = read(fd2, buff,255)) > 0 )
   {
    。。。。
   }
  }
 }
这个错误相当隐蔽,所以,在编程中一定不要偷懒而少加{},不然往往浪费大量的时间才能找到这类错误。
整个程序正确的写法如下:
 while (1) //循环读取数据
 {
  fprintf( stdout,"epoll wait...\n");
  int nfds = epoll_wait( epollfd, events, 2, -1 );
  for( i=0; i< nfds; i++ )
  {
   if( events[i].data.fd == fd )
   {
    if( (nread = read(fd, buff, 255 )) > 0 )
    {
     fprintf( stdout,"dug com receive data!\n");
     fprintf( stdout,"len = %d\ndata :",nread);

     for(j=0;j<nread;j++) fprintf(stdout,"%02x ",buff[j]);
     fprintf(stdout,"\n" );
     write( fd2 , buff ,nread );
    }
   }
   else if( events[i].data.fd == fd2 )
   {
    if( (nread = read(fd2, buff,255)) > 0 )
    {
     fprintf( stdout,"down com receive data!\n");
     fprintf( stdout,"len = %d\ndata :",nread);
     
     for(j=0;j<nread;j++) fprintf(stdout,"%02x ",buff[j]);
     fprintf(stdout,"\n" );
     write( fd, buff, nread );
    }
   }
  }
 }

posted @ 2013-04-03 15:26  chad leo  阅读(35)  评论(0)    收藏  举报