• <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?
              回復  更多評論
              

            99re久久精品国产首页2020| 99久久www免费人成精品| 麻豆av久久av盛宴av| 日本久久久久亚洲中字幕| 国产精品久久亚洲不卡动漫| 久久人人爽人人爽人人片AV麻豆| 久久人人添人人爽添人人片牛牛| 国产三级久久久精品麻豆三级 | 久久九色综合九色99伊人| 久久精品极品盛宴观看| 久久国产精品成人影院| 久久久噜噜噜久久| 国内精品久久久久影院薰衣草 | 9191精品国产免费久久| 超级碰碰碰碰97久久久久| 国产精品久久久久久久午夜片| 热99RE久久精品这里都是精品免费| 粉嫩小泬无遮挡久久久久久| 伊人久久精品影院| 久久人人爽人爽人人爽av| 国产成人精品久久二区二区| 久久中文字幕人妻丝袜| 性欧美大战久久久久久久| 九九久久精品无码专区| 亚洲精品高清久久| 国产精品久久久久久久久| 久久99精品久久久久久久久久| 久久综合视频网| 亚洲精品成人久久久| 久久久久久国产精品美女| 国产成人AV综合久久| 国产精品久久久久久影院| 99久久成人国产精品免费| 久久人人爽爽爽人久久久| 中文字幕久久精品无码| 久久精品国产2020| 久久久久亚洲av无码专区导航| 国产精品无码久久综合| 99久久99久久| 久久e热在这里只有国产中文精品99| 一本久久久久久久|