下载的主循环:

下载的主循环:
  1.         signal( SIGINT, stop );
  2.         signal( SIGTERM, stop );
  3.         //没收下载完或者收到停止信号前,一直下载
  4.         //axel_start中已经把axel->ready置为0了
  5.         //stop信号处理中会把run置为0
  6.         while( !axel->ready && run )
  7.         {
  8.                 long long int prev, done;
  9.                 
  10.                 prev = axel->bytes_done;
  11.                 //进入下载函数,进行数据接收
  12.                 axel_do( axel );
  13.                 
  14.                 //配置了-a方式打印信息的话
  15.                 if( conf->alternate_output )
  16.                 {                        
  17.                         //有信息需要打印而且有进度产生
  18.                         if( !axel->message && prev != axel->bytes_done )
  19.                                 print_alternate_output( axel );
  20.                 }
  21.                 else//否则,用wget打印的方式去打印信息
  22.                 {
  23.                         /* The infamous wget-like 'interface'.. ;)                */
  24.                         //转换成K,下载增量
  25.                         done = ( axel->bytes_done / 1024 ) - ( prev / 1024 );
  26.                         //下载不为0K,而且要打印
  27.                         if( done && conf->verbose > -1 )
  28.                         {
  29.                                 for( i = 0; i < done; i ++ )
  30.                                 {
  31.                                         i += ( prev / 1024 );
  32.                                         //50个字符一换行
  33.                                         if( ( i % 50 ) == 0 )
  34.                                         {
  35.                                                 //大于1K
  36.                                                 if( prev >= 1024 )
  37.                                                         printf( "  [%6.1fKB/s]", (double) axel->bytes_per_second / 1024 );
  38.                                                 //打印进度。。百分比
  39.                                                 //文件小于10M
  40.                                                 if( axel->size < 10240000 )
  41.                                                         printf( "\n[%3lld%%]  ", min( 100, 102400 * i / axel->size ) );
  42.                                                 else//大于等于10M
  43.                                                         printf( "\n[%3lld%%]  ", min( 100, i / ( axel->size / 102400 ) ) );
  44.                                         }//10个字符一个空格
  45.                                         else if( ( i % 10 ) == 0 )
  46.                                         {
  47.                                                 putchar( ' ' );
  48.                                         }
  49.                                         putchar( '.' );
  50.                                         i -= ( prev / 1024 );
  51.                                 }
  52.                                 fflush( stdout );
  53.                         }
  54.                 }
  55.                 
  56.                 if( axel->message )
  57.                 {
  58.                         if(conf->alternate_output==1)
  59.                         {
  60.                                 /* clreol-simulation */
  61.                                 putchar( '\r' );
  62.                                 for( i = 0; i < 79; i++ ) /* linewidth known? */
  63.                                         putchar( ' ' );
  64.                                 putchar( '\r' );
  65.                         }
  66.                         else
  67.                         {
  68.                                 putchar( '\n' );
  69.                         }
  70.                         print_messages( axel );
  71.                         if( !axel->ready )
  72.                         {
  73.                                 if(conf->alternate_output!=1)
  74.                                         print_commas( axel->bytes_done );
  75.                                 else
  76.                                         print_alternate_output(axel);
  77.                         }
  78.                 }
  79.                 else if( axel->ready )
  80.                 {
  81.                         putchar( '\n' );
  82.                 }
  83.         }
  84.         //下载完成,打印信息
  85.         strcpy( string + MAX_STRING / 2,
  86.                 size_human( axel->bytes_done - axel->start_byte ) );
  87.         //打印下载速度
  88.         printf( _("\nDownloaded %s in %s. (%.2f KB/s)\n"),
  89.                 string + MAX_STRING / 2,
  90.                 time_human( gettime() - axel->start_time ),
  91.                 (double) axel->bytes_per_second / 1024 );
  92.         
  93.         i = axel->ready ? 0 : 2;
  94.         //关闭连接
  95.         axel_close( axel );
复制代码

你可能感兴趣的:(下载的主循环:)