• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            網絡服務器軟件開發/中間件開發,關注ACE/ICE/boost

            C++博客 首頁 新隨筆 聯系 聚合 管理
              152 Posts :: 3 Stories :: 172 Comments :: 0 Trackbacks

            ACE_NT_Service(WINDOWS)
            本人的觀點,SERVICE就是WINDOWS版的DAEMON。ACE_NT_Service通過包裝一整套WINDOWS提供的SERVICE API定義了一個控制NT SERVICE的接口。應用程序繼承該接口就可以實現和UNIX上DAEMON相似的功能。下面先簡單描述WINDOWSSERVICE程序框架,再詳細描述類ACE_NT_Service對WINDOWS SERVICE程序框架的包裝。

            WINDOWS SERVICE
            一個完整的NT SERVICE程序應該包含以下四部分:
            1.控制臺應用程序的main函數
            2.SERVICE入口函數ServiceMain
            3.SERVICE CONTROL HANDLER,SCM利用該函數和SERVICE通信并控制程序的起停。
            4.SERVICE安裝和卸載器

            ServiceMain和Service Control Handler
            首先我們來討論ServiceMain和Service Control Handler。WINDOWS規定每個SERVICE都擁有自己獨立的ServiceMain以及Service Control Handler函數。主程序調用StartServiceCtrlDispatcher時,WINDOWS為每個SERVICE創建一個線程,并且在新線程中運行ServiceMain函數。SCM利用Service Control Handler函數和SERVICE程序通信,用戶執行start,stop,pause以及continue等操作時,SCM通過Service Control Handler函數來控制SERVICE的行為。Service Control Handler函數基本上會包含一個switch語句來處理每種情況。

            安裝/卸載SERVICE
            WINDOWS提供一些API來安裝/卸載SERVICE,這樣我們就可以不使用注冊函數就能在系統中注冊這些節點。這些API分別是CreateService和DeleteService。要安裝SERVICE,需要先利用函數OpenSCManager打開SCM數據庫,接著利用SERVICE的二進制文件路徑調用CreateService,在調用CreateService時需要為SERVICE指定名稱,原因是使用DeleteService刪除服務時需要利用該標識。

            ACE_NT_Service
            查看ACE源碼,其中和類 ACE_NT_Service實現密切相關的的文件有NT_Service.cpp、NT_Service.h、NT_Service.i。

            ACE_NT_Service中的ServiceMain和Service Control Handler
            ServiceMain和Service Control Handler定義具有固定模式,ACE_NT_Service提供宏#define ACE_NT_SERVICE_DEFINE(SVCNAME, SVCCLASS, SVCDESC)用于簡化定義。具體的宏定義可以參考ACE代碼,這里不再列出,這里只分析相關的類ACE_NT_Service的成員函數handle_control,init,open,wait和fini。函數handle_control被用于響應SERVICE DISPATCHER請求,其必須和SVC函數交互以影響請求控制操作。缺省實現包括SERVICE_CONTROL_STOP,SERVICE_CONTROL_PAUSE,SERVICE_CONTROL_CONTINUE,SERVICE_CONTROL_INTERROGATE,SERVICE_CONTROL_SHUTDOWN。

            函數handle_control的部分關鍵代碼解析
            /* 調用stop_requested響應關閉操作 */
            case SERVICE_CONTROL_SHUTDOWN:
            case SERVICE_CONTROL_STOP:
            this->stop_requested (control_code);
            break;
            /* 調用pause_requested響應掛起操作 */
            case SERVICE_CONTROL_PAUSE:
            this->pause_requested (control_code);
            break;
            /* 調用continue_requested響應掛起后啟動操作 */
            case SERVICE_CONTROL_CONTINUE:
            this->continue_requested (control_code);
            break;
            /* 調用interrogate_requested報告當前狀態*/
            case SERVICE_CONTROL_INTERROGATE:
            this->interrogate_requested (control_code);
            break;

            函數open 的部分關鍵代碼解析
            /* 報告狀態 */
            this->report_status (SERVICE_START_PENDING, 0);
            /* 執行用戶代碼 */
            int svc_return = this->svc ();

            函數fini 的部分關鍵代碼解析
            /* 報告狀態 */
            return this->report_status (SERVICE_STOPPED, 0);

            函數stop_requested的部分關鍵代碼解析
            /* 報告狀態 */
            this->report_status (SERVICE_STOP_PENDING);

            函數pause_requested的部分關鍵代碼解析
            /* 報告狀態 */
            this->report_status (SERVICE_PAUSE_PENDING);
            /* 掛起*/
            this->suspend ();
            /* 報告狀態 */
            this->report_status (SERVICE_PAUSED);

            函數continue_requested的部分關鍵代碼解析
            /* 報告狀態 */
            this->report_status (SERVICE_CONTINUE_PENDING);
            /* 恢復*/
            this->resume ();
            /* 報告狀態 */
            this->report_status (SERVICE_RUNNING);

            函數interrogate_requested的部分關鍵代碼解析
            /* 報告狀態 */
            this->report_status (0);
            安裝/卸載SERVICE
            ACE_NT_Service定義兩個成員函數Insert,remove來安裝(卸載)SERVICE。它們分別在內部調用WINDOWS API——CreateService以及DeleteService。

            Insert函數的部分關鍵代碼解析

            /* 打開和host()上SCManager的通信 */
            SC_HANDLE sc_mgr = ACE_TEXT_OpenSCManager (this->host (),……);
            /* 以名稱name() 創建服務 */
            SC_HANDLE sh = ACE_TEXT_CreateService (sc_mgr,this->name (),this->desc (),
            SERVICE_ALL_ACCESS,this->svc_status_.dwServiceType,start_type,
            error_control,exe_path,……);
            /* 關閉和SCManager的通信 */
            CloseServiceHandle (sc_mgr);
            /* 關閉服務句柄,重新寫入新句柄 */
            if (this->svc_sc_handle_ != 0)
            CloseServiceHandle (this->svc_sc_handle_);
            this->svc_sc_handle_ = sh;

            Remove函數部分關鍵代碼解析

            /* 從SCM中刪除insert創建的服務句柄 */
            if (DeleteService (this->svc_sc_handle()) == 0
            && GetLastError () != ERROR_SERVICE_MARKED_FOR_DELETE)
            控制SERVICE
            ACE_NT_Service定義成員函數start_svc, stop_svc, pause_svc, continue_svc分別用于啟動、停止、掛起和繼續服務。
            start_svc函數的部分關鍵代碼解析

            /* 啟動服務 */
            if (!ACE_TEXT_StartService (svc, argc, argv))
            this->wait_for_service_state (SERVICE_RUNNING, wait_time);

            stop_svc函數的部分關鍵代碼解析

            /* 關閉服務 */
            if (!ControlService (svc, SERVICE_CONTROL_STOP, &this->svc_status_))
            this->wait_for_service_state (SERVICE_STOPPED, wait_time);

            pause_svc函數的部分關鍵代碼解析

            /* 吊起服務 */
            if (!ControlService (svc, SERVICE_CONTROL_PAUSE,&this->svc_status_))
            this->wait_for_service_state (SERVICE_PAUSED,wait_time);

            continue_svc函數的部分關鍵代碼解析

            /* 將掛起業務重新啟動 */
            if (!ControlService (svc,SERVICE_CONTROL_CONTINUE,&this->svc_status_))
            this->wait_for_service_state (SERVICE_RUNNING,wait_time);

            一些輔助函數
            svc_sc_handle部份關鍵代碼解析

            /* 打開SCM */
            SC_HANDLE sc_mgr = ACE_TEXT_OpenSCManager (this->host (),……)
            if (sc_mgr != 0)
            {
            /* 獲取服務句柄 */
            this->svc_sc_handle_ = ACE_TEXT_OpenService (sc_mgr,……)
            /* 關閉SCM */
            CloseServiceHandle (sc_mgr);
            }
            /* 返回獲取到的服務句柄 */
            return this->svc_sc_handle_;

            wait_for_service_state部份關鍵代碼解析

            /* 獲取當前時間 */
            ACE_Time_Value time_out = ACE_OS::gettimeofday ();
            /* 加上等待時間 */
            if (wait_time != 0) time_out += *wait_time;
            // Poll until the service reaches the desired state.
            for (;
            {
            /* 查詢當前狀態 */
            service_ok = 0 != QueryServiceStatus (this->svc_sc_handle_, &this->svc_status_);
            /* 如果已經到達指定狀態,退出循環 */
            if (desired_state == this->svc_status_.dwCurrentState) break;
            /* 如果超出指定時間,退出循環 */
            if (wait_time != 0 && ACE_OS::gettimeofday () > time_out )
            { ……
            break;
            }
            /* 睡眠等待 */
            ::Sleep (this->svc_status_.dwWaitHint);
            }

            report_status部份關鍵代碼解析
            /* 告訴系統服務新的狀態 */
            SetServiceStatus (this->svc_handle_,&this->svc_status_) ? 0 : -1;

             

             



            Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=748930

            posted on 2007-04-24 17:55 true 閱讀(1066) 評論(1)  編輯 收藏 引用 所屬分類: ACE

            Feedback

            # re: ACE_NT_Service(WINDOWS 2007-06-14 15:42 terran
            red hat linux 9
            can we use ACE_NT_Service this class?
              回復  更多評論
              

            国产叼嘿久久精品久久| 97久久精品无码一区二区天美| 伊人久久大香线蕉综合影院首页| 国产午夜电影久久| 国产亚洲美女精品久久久 | 久久精品一区二区| 精品熟女少妇a∨免费久久| 国产精品9999久久久久| 久久精品国产亚洲网站| 国产精品九九久久精品女同亚洲欧美日韩综合区 | 亚洲精品乱码久久久久久| 久久久精品国产免大香伊| 久久精品黄AA片一区二区三区| 99久久超碰中文字幕伊人| 91精品无码久久久久久五月天| 久久强奷乱码老熟女| 亚洲中文字幕久久精品无码喷水| 国产精品久久久久影院嫩草| 色偷偷88欧美精品久久久| 久久国产亚洲高清观看| 色婷婷噜噜久久国产精品12p| 久久无码人妻一区二区三区午夜| 国产成人精品久久一区二区三区av| 久久只有这精品99| 久久久久久综合一区中文字幕| 久久国产精品免费一区| 久久丫精品国产亚洲av不卡| 久久青青草原精品国产不卡| 国产精品久久网| 精品国产日韩久久亚洲| 国产成人精品综合久久久| 亚洲精品无码久久千人斩| 久久精品亚洲乱码伦伦中文 | 国产女人aaa级久久久级| 亚洲伊人久久大香线蕉综合图片 | AAA级久久久精品无码片| 久久人人爽人人爽人人av东京热| 久久精品国产一区二区三区不卡 | 2021久久国自产拍精品| 久久久久亚洲av无码专区导航| 精品久久久久成人码免费动漫|