青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

網絡服務器軟件開發/中間件開發,關注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 閱讀(1088) 評論(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?
  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久精品人人做人人爽| 亚洲嫩草精品久久| 国产一区二区中文| 亚洲高清毛片| 在线观看亚洲| 欧美一区1区三区3区公司| 久久国产主播| 99亚洲伊人久久精品影院红桃| 久久se精品一区二区| 欧美人与禽猛交乱配视频| 国产精品一区二区三区观看| 国产女主播在线一区二区| 一片黄亚洲嫩模| 久久国产一区二区三区| 夜夜嗨av一区二区三区网站四季av | 久久久人人人| 亚洲一区二区在| 欧美日韩一区二区三区在线观看免| 亚洲国产精品久久久久秋霞不卡 | 欧美福利网址| 最新国产乱人伦偷精品免费网站 | 久久蜜桃香蕉精品一区二区三区| 亚洲欧美国产日韩天堂区| 国产精品一区二区女厕厕| 久久精品国产久精国产一老狼| 性欧美精品高清| 一区二区在线观看av| 欧美成人r级一区二区三区| 麻豆精品在线视频| …久久精品99久久香蕉国产| 亚洲电影下载| 欧美连裤袜在线视频| 一区二区三区视频观看| 一区二区av在线| 国产九色精品成人porny| 久久久精品性| 欧美激情在线狂野欧美精品| 亚洲自拍三区| 久久xxxx| 中文国产成人精品久久一| 亚洲欧美国产一区二区三区| 国产亚洲在线观看| 亚洲国产日韩欧美在线图片| 国产精品久久久亚洲一区| 亚洲黄色视屏| 欧美一级理论片| 久久久久久久久久看片| 亚洲美女黄色片| 亚洲欧美激情视频| 亚洲激情另类| 亚洲综合日本| 亚洲精品中文字| 香蕉久久精品日日躁夜夜躁| 国产欧美日韩三区| 午夜久久久久久| 亚洲国产小视频| 国产一区清纯| 午夜久久久久久| 亚洲免费视频观看| 欧美日韩在线不卡一区| 亚洲一区二区三区高清 | 玖玖精品视频| 欧美激情一区在线观看| 久久精品人人做人人综合| 欧美成人一区二区三区片免费| 欧美视频在线一区| 亚洲精品久久嫩草网站秘色 | 一区二区三区久久网| 韩日精品视频一区| 久久精品99久久香蕉国产色戒| 久久久最新网址| 日韩亚洲精品视频| 欧美午夜免费影院| 一区二区欧美在线观看| 性一交一乱一区二区洋洋av| 国产一区二区三区免费在线观看| 久久中文字幕一区| 久久天天躁夜夜躁狠狠躁2022| 亚洲一区二区网站| 久久er99精品| 在线亚洲欧美视频| 亚洲人午夜精品免费| 久久夜色精品国产| 亚洲国产清纯| 久久综合电影| 国产情人节一区| 宅男噜噜噜66国产日韩在线观看| 亚洲乱亚洲高清| 久久躁狠狠躁夜夜爽| 久久男人av资源网站| 国产精品午夜电影| 亚洲一区二区三区四区五区午夜| 亚洲午夜精品| 欧美午夜电影一区| 99精品国产高清一区二区| 亚洲免费福利视频| 欧美日本中文字幕| 裸体丰满少妇做受久久99精品| 欧美一区二区视频免费观看| 亚洲视频网站在线观看| 亚洲激情电影中文字幕| 艳女tv在线观看国产一区| 国产精品免费观看在线| 欧美成年视频| 欧美1级日本1级| 欧美日韩国产综合一区二区| 伊人久久综合97精品| 午夜精品久久久久影视| 欧美日本免费| 亚洲乱亚洲高清| 亚洲一二三区视频在线观看| 国产精品久久久久高潮| 亚洲色图制服丝袜| 久久精品国产99| 最新成人在线| 欧美色欧美亚洲另类七区| 亚洲天堂黄色| 久久九九全国免费精品观看| 亚洲国产精品99久久久久久久久| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲国产成人精品视频| 一区二区高清| 国产亚洲va综合人人澡精品| 欧美凹凸一区二区三区视频| 亚洲少妇诱惑| 老牛影视一区二区三区| 亚洲电影免费观看高清| 欧美日韩不卡视频| 欧美一区二区在线播放| 亚洲人成亚洲人成在线观看| 欧美午夜精品久久久久久浪潮| 午夜影院日韩| 亚洲第一精品夜夜躁人人躁| 午夜国产欧美理论在线播放| 在线观看国产精品淫| 欧美日韩伦理在线免费| 久久电影一区| 亚洲最新在线| 欧美成人免费观看| 欧美一区二区久久久| 亚洲免费成人| 伊人精品成人久久综合软件| 国产精品毛片va一区二区三区| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲私拍自拍| 亚洲国产va精品久久久不卡综合| 久久国产精品毛片| 国产精品入口| 免费中文日韩| 先锋a资源在线看亚洲| 亚洲国产欧美另类丝袜| 欧美自拍丝袜亚洲| 中文亚洲欧美| 亚洲欧洲一区二区在线播放| 国产午夜精品美女视频明星a级| 翔田千里一区二区| 中文亚洲欧美| 韩国av一区| 亚洲国产欧美一区二区三区同亚洲| 久久一区二区三区av| 99国产精品视频免费观看一公开 | 亚洲精品麻豆| 久久一区中文字幕| 亚洲久久一区二区| 欧美日韩在线一区二区| 久久久国产一区二区三区| 久久野战av| 亚洲欧美日本伦理| 国产精品99久久久久久人 | 免费一级欧美片在线观看| 欧美一级视频免费在线观看| 亚洲专区一区二区三区| 亚洲在线视频免费观看| 在线视频欧美日韩精品| 日韩特黄影片| 日韩一区二区精品葵司在线| 亚洲美女av网站| 这里是久久伊人| 亚洲一区二区在| 午夜欧美不卡精品aaaaa| 亚洲欧美在线一区| 亚洲专区一区| 欧美亚洲日本一区| 欧美在线视频观看| 久久国产免费看| 久久三级视频| 欧美91大片| 欧美日韩三级视频| 国产精品久久久久久久久免费樱桃| 欧美日韩亚洲精品内裤| 欧美午夜性色大片在线观看| 国产精品国产三级国产专播精品人| 国产精品v欧美精品v日本精品动漫 | 午夜国产欧美理论在线播放| 亚洲影院免费| 欧美一区二区视频在线| 久久婷婷av| 欧美久久久久久久久| 欧美性猛片xxxx免费看久爱| 国产毛片一区二区|