Windows服務編寫原理及探討(2)

來源:互聯網
上載者:User

(二)對服務的深入討論之上

上一章其實只是概括性的介紹,下面開始才是真正的細節所在。在進入點函數裡面要完成ServiceMain的初始化,準確點說是初始化一個SERVICE_TABLE_ENTRY結構數組,這個結構記錄了這個服務程式裡面所包含的所有服務的名稱和服務的進入點函數,下面是一個SERVICE_TABLE_ENTRY的例子:

SERVICE_TABLE_ENTRY service_table_entry[] =
{
  { "MyFTPd" , FtpdMain },
  { "MyHttpd", Httpserv},
  { NULL, NULL },
};

第一個成員代表格服務的名字,第二個成員是ServiceMain回呼函數的地址,上面的服務程式因為擁有兩個服務,所以有三個SERVICE_TABLE_ENTRY元素,前兩個用於服務,最後的NULL指明數組的結束。

接下來這個數組的地址被傳遞到StartServiceCtrlDispatcher函數:

BOOL StartServiceCtrlDispatcher(
LPSERVICE_TABLE_ENTRY lpServiceStartTable
)

這個Win32函數表明可執行檔的進程怎樣通知SCM包含在這個進程中的服務。就像上一章中講的那樣,StartServiceCtrlDispatcher為每一個傳遞到它的數組中的非空元素產生一個新的線程,每一個進程開始執行由數組元素中的lpServiceStartTable指明的ServiceMain函數。

SCM啟動一個服務程式之後,它會等待該程式的主線程去調StartServiceCtrlDispatcher。如果那個函數在兩分鐘內沒有被調用,SCM將會認為這個服務有問題,並調用TerminateProcess去殺死這個進程。這就要求你的主線程要儘可能快的調用StartServiceCtrlDispatcher。

StartServiceCtrlDispatcher函數則並不立即返回,相反它會駐留在一個迴圈內。當在該迴圈內時,StartServiceCtrlDispatcher懸掛起自己,等待下面兩個事件中的一個發生。第一,如果SCM要去送一個控制通知給運行在這個進程內一個服務的時候,這個線程就會啟用。當控制通知到達後,線程啟用並調用相應服務的CtrlHandler函數。CtrlHandler函數處理這個服務控制通知,並返回到StartServiceCtrlDispatcher。StartServiceCtrlDispatcher迴圈回去後再一次懸掛自己。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.