用Windows服務做守護程序

2021-08-29 15:47:17 字數 3710 閱讀 2441

// createservice.cpp : 定義應用程式的入口點。

//#include "stdafx.h"

#include #include #include #include #pragma comment(linker,"/subsystem:windows")

//定義全域性函式變數  

void init();

bool isinstalled();

bool install();

bool uninstall();

void logevent(lpctstr pszformat, ...);

void winapi servicemain();

void winapi servicestrl(dword dwopcode);

tchar szservicename = _t("fsdeamon");

bool binstall;

service_status_handle hservicestatus;

service_status status;

dword dwthreadid;

int apientry _twinmain(hinstance hinstance,

hinstance hprevinstance,

lptstr    lpcmdline,

int       ncmdshow)

,        

};if (stricmp(lpcmdline, "/install") == 0)

else if (stricmp((lpctstr)lpcmdline, "/uninstall") == 0)

else

}return 0;

}//初始化

void init()

//服務主函式,這在裡進行控制對服務控制的註冊

startupinfo si;

process_information pi;

std::atomicbstopserver;

void winapi servicemain()

setservicestatus(hservicestatus, &status);

status.dwwin32exitcode = s_ok;

status.dwcheckpoint = 0;

status.dwwaithint = 0;

status.dwcurrentstate = service_running;

setservicestatus(hservicestatus, &status);

zeromemory(&si, sizeof(si));

si.cb = sizeof(si);

zeromemory(&pi, sizeof(pi));

char szapipath[max_path] = ;

getmodulefilename(null, szapipath, max_path);

std::string strpath(szapipath);

int pos = strpath.find_last_of('\\', strpath.length());

strpath = strpath.substr(0, pos);

bstopserver = false;

do sleep(5000);

}waitforsingleobject(pi.hprocess, infinite);

dword returncode;

getexitcodeprocess(pi.hprocess, &returncode);

closehandle(pi.hprocess);

closehandle(pi.hthread);

file *p;

p = fopen((strpath + "\\log.txt").c_str(), "ab+");

if (p)

;sprintf_s(msg, "freeswitchconsole exit(%u)\n", returncode);

fwrite(msg, strlen(msg), 1, p);

fclose(p);

}//if(returncode==0)

} while (!bstopserver);

status.dwcurrentstate = service_stopped;

setservicestatus(hservicestatus, &status);

}//description:          服務控制主函式,這裡實現對服務的控制,  

//                      當在服務管理器上停止或其它操作時,將會執行此處**  

void winapi servicestrl(dword dwopcode)

}//判斷服務是否已經被安裝

bool isinstalled()

::closeservicehandle(hscm);

}return bresult;

}//安裝服務函式

bool install()

//獲取程式目錄

tchar szfilepath[max_path];

::getmodulefilename(null, szfilepath, max_path);

//建立服務  

sc_handle hservice = ::createservice(hscm, szservicename, szservicename,

service_all_access, service_win32_own_process | service_interactive_process, service_auto_start, service_error_normal,

szfilepath, null, null, _t(""), null, null);

//檢測建立是否成功

if (hservice == null)

//釋放資源

::closeservicehandle(hservice);

::closeservicehandle(hscm);

return true;

}//刪除服務函式

bool uninstall()

//開啟具體服務

sc_handle hservice = ::openservice(hscm, szservicename, service_stop | delete);

if (hservice == null)

//先停止服務

service_status status;

::controlservice(hservice, service_control_stop, &status);

//刪除服務  

bool bdelete = ::deleteservice(hservice);

::closeservicehandle(hservice);

::closeservicehandle(hscm);

if (bdelete)  return true;

logevent(_t("service could not be deleted"));

return false;

}//記錄服務事件

void logevent(lpctstr pformat, ...)

}

windows守護程序指令碼

今天早上起來的時候發現電驢5點鐘的時候掛了,於是有幾個應該已經下完的東西還停留在95 的樣子。鬱悶之外想寫個守護程序的指令碼,上網搜了下找到這位同學的部落格 url 略加修改便拿來用了。首先是crontab.cmd檔案 如果在unix linux下用crontab那真是很簡單的事了 restart ...

C 寫的windows服務程序守護實現

最近在做乙個windows服務實現windows socket server讀取系統硬體,rfid的內容給web 使用。在測試過程中,發現rfid讀取過程有時會導致服務無端中止。因為涉及到硬體呼叫,查不到具體的原因。所以就簡單的處理,做乙個程序守護,當windows的服務程序退出之後,自動重新開啟。...

windows下守護程序實現

這裡的守護程序指的是無控制終端的程序。linux下執行程序只需要後面新增 就可以實現。有的時候需要設計乙個可以同時在windows和linux下執行的守護程序 為了避免過多的修改 可以新增如下偽指令來實現 ifndef win32 pragma comment linker,subsystem wi...