Windows XP Windows 7 Windows 2003 Windows Vista Windows教程綜合 Linux 系統教程
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟件教程

Linux主控程序

日期:2017/1/20 17:42:36      編輯:Linux系統常見問題解答

6.1、Liunx程序的整體思路

  init進程是Linux內核啟動的第一個進程,它是後續所有進程的發起者。本系統的init進程為指向rc進程的鏈接,因此rc進程為主進程,是進入內核首先運行的程序,做初始,在主進程程序中再啟動其它子進程。掛起等待進程信號。

  子進程通過發信號通知主進程、主進程收到信號後做某些事物處理或啟動或關閉其它子進程。此外有些進程之間是通過socket套接字進行通信。

  對於有些進程是程序運行一次即退出,有些進程是程序一直循環運行。

  6.1、rc程序

  主進序名為rc,init、ip-up、ip-down、dtu-dns、start_watchdog、start-lan、stop-lan、start_timer等這些進程都是指向rc的連接,當運行這些進程時rc進程根據進程參數判斷執行哪些處理程序,

  如果運行的是init指示符,則進入RC主循環執行。

  6.3、初始化運行環境

  主循環包括以下幾部分的初始化:

  1、系統初始化

  掛載系統相關目錄

  所有設備結點的生成

  掛載flash分區相關目錄

  創建參數文件的鏈接

  創建相關目錄

  設備參數初始化

  控制台初始化

  內核模塊載入

  時區設置、系統時間與硬件同步

  內置硬件看門狗啟動

  外置硬件看門狗啟動

  2、GPIO初始化

  打開關閉相關指示燈、打開模塊電源、關閉子板電源

  關閉不用的GPIO

  打開子板電源

  各模塊初始化

  3、局域網開啟

  4、信號初始化

  信號初始化

  注冊信號

  5、配置文件初始化

  PPP拔號相關配置文件

  DTU參數配置文件

  網控器參數配置文件

  電話或短信觸發配置文件

  ICMP檢測配置文件

  DNS檢測配置文件

  DDNS參數配置文件

  維護通道參數配置文件

  6.4、運行各種進程

  1、開啟TCP本地server

  開啟流程如下圖所示:

  圖6.2 本地server進程流程圖

  2、開啟各種服務

  Httpd服務器開啟

  DTU客戶端連接開啟

  Dhcpd服務開啟

  Telnet服務開啟

  監視重復進程數量服務開啟

  流量統計開啟


 6.5、確保PPPD進程正確運行

  1、運行pppd之前先判斷模塊接口是否可以正常打開,如果打開異常則重啟系統。

  2、運行pppd後每隔1秒判斷是否生成/tmp/ppp/link.文件,在超時時間內沒生成則重新撥號。

  3、重新運行pppd前要對模塊做復位處理,斷開pppd連接避免上次運行的pppd沒退出。

  4、pppd撥號成功開啟網絡測試功能,避免pppd自身檢測不到掉線。

  6.6、運行至循環處理

  主程序初始化完畢,相關服務開啟後開始進入主循環處理,主循環中開始撥號上線及上線後的各種處理,最後空閒掛起等待事件信號。主循環主要是監控PPPD和WAN是否有異常,發現異常則做相應的處理,處理流程如下圖所示:

  圖6.3 主進程主循環流程圖

  如上面的流程圖可以看出,主循環是一個狀態機。當有進程發來信號時,信號處理函數改變狀態的值,主循環跳出IDLE狀態,到RESTART,或STOP狀態,再次循環執行,最後穩定到空閒狀態。常見的是當PPPD下線運行ip-down進程,該進程發信號給主進程,主進程到RESTART狀態。主程序重新運行撥號處理。

  6.7、信號的使用

  信號是UNIX和Linux系統響應某些條件而產生的一個事件,接收到該信號的進程會相應地采取一些行動。通常信號是由一個錯誤產生的。但它們還可以作為進程間通信或修改行為的一種方式,明確地由一個進程發送給另一個進程。一個信號的產生叫生成,接收到一個信號叫捕獲。

  需要包含的頭文件:#include <signal.h>

  信號的使用包括以下步驟:

  1、注冊一個信號。

  例如:signal(SIGHUP, rc_signal);

  2、信號處理函數。

  static void rc_signal(int sig)

  {

  ……

  if (sig == SIGHUP) {

  syslog(6,"signalling RESTART\n");

  signalled = RESTART;

  }

  ……

  }

  3、發送信號

  給主進程發信號:kill(1, SIGHUP);

Copyright © Windows教程網 All Rights Reserved