Android培訓班(14) – Android移動開發技術文章_手機開發 Android移動開發教學課程

#200 


#201      for(;;) {


#202          int nr, i, timeout = -1;


這段代碼是進入死循環處理,以便這個init進程變成一個服務。


 


#203 


#204          for (i = 0; i < fd_count; i++)


#205              ufds[i].revents = 0;


這段代碼是清空每個socket的事件計數。


 


#206 


#207          drain_action_queue();


這段代碼是執行隊列裡的命令。


 


#208          restart_processes();


這句代碼是用來判斷那些服務需要重新啟動。


 


#209 


#210          if (process_needs_restart) {


#211              timeout = (process_needs_restart – gettime()) * 1000;


#212              if (timeout < 0)


#213                  timeout = 0;


#214          }


這段代碼是用來判斷那些進程啟動超時。


 


 


#215 


#216  #if BOOTCHART


#217          if (bootchart_count > 0) {


#218              if (timeout < 0 || timeout > BOOTCHART_POLLING_MS)


#219                  timeout = BOOTCHART_POLLING_MS;


#220              if (bootchart_step() < 0 || –bootchart_count == 0) {


#221                  bootchart_finish();


#222                  bootchart_count = 0;


#223              }


#224          }


#225  #endif


這段代碼是用來計算運行性能。


 


#226          nr = poll(ufds, fd_count, timeout);


#227          if (nr <= 0)


#228              continue;


這段代碼用來輪詢幾個socket是否有事件處理。


 


#229 


#230          if (ufds[2].revents == POLLIN) {


#231              /* we got a SIGCHLD – reap and restart as needed */


#232              read(signal_recv_fd, tmp, sizeof(tmp));


#233              while (!wait_for_one_process(0))


#234                  ;


#235              continue;


#236          }


這段代碼是用來處理子進程的通訊,並且能刪除任何已經退出或者殺死死進程,這樣做可以保持系統更加健壯性,增強容錯能力。


 


 


#237 


#238          if (ufds[0].revents == POLLIN)


#239              handle_device_fd(device_fd);


這段代碼是處理設備事件。


 


#240 


#241          if (ufds[1].revents == POLLIN)


#242              handle_property_set_fd(property_set_fd);


這段代碼是處理屬性服務事件。


 


#243          if (ufds[3].revents == POLLIN)


#244              handle_keychord(keychord_fd);


這段代碼是處理調試模式下的組合按鍵。


 


#245      }


#246 


#247      return 0;


#248  }


#249 


 


到這裡已經分析完成init進程的主流程,後面再來詳細地其它功能實現

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。