在windows中,服务是一种特殊的进程,可以说它和用户无关,它的作用不是完成用户任务,而是进行一些管理类的操作或者通用的服务类操作,实际上windows服务就是一个可执行文件,但是远远不只是这些。
Windows NT的服务架构非常复杂,是整个系统架构中独立的一块。windows服务执行的往往都是一些无须用户介入的任务,也就是说它执行的任务不是具体的,而是具有支撑性质的,比较底层的,比如网络登录,文件驱动,设备驱动,ftp等等,其他的进程往往就和登录用户密切相关了,毕竟计算机就是让用户使用的,而其上执行的任务也就是用户要求的,因此用户是windows进程一个很重要的属性,同时也是操作系统本身一个很重要的性质,可以实现安全管理等相关操作。
windows服务主要由三部分组成,一是服务本身;二是服务控制管理器(SCM);三是服务控制程序(SCP)。SCM是个管理中心,管理着所有的线上服务,所谓线上服务就是已经安装的服务,SCP和SCM交互来管理服务本身,注意服务本身并不需要直接和SCM交互,这样就可以让写一个服务变得更加容易,人们可以像写普通的应用程序一样来完成一个服务的编程,唯一需要附加的就是和SCP接口就可以了,这样看来虽然windows服务的架构非常复杂,但是三者之间的耦合度却很低,足见设计的精妙。SCM维护着一个数据库,该数据库储存着已安装的服务和驱动程序的信息,SCM管理着它们,SCM根据这些信息控制服务的关闭和启动等行为,服务可以从SCM接收命令然后采取一定的动作,注意它是通过SCP来接收命令的,服务本身就是一个一直运行的应用程序,SCP作为一个 接口提供出来,用户可以通过它控制服务的行为,SCM同时也和SCP交互,在这繁复的数据流背后是成熟的RPC,windows中信号是不流行的,但是RPC却非常普遍,下面通过一个简单例子说明一下枝枝蔓蔓:
#include "stdafx.h"
#include <windows.h></windows.h>
void Install(char * name);
void Uninstall(char *name);
char *a = "mee11";
BOOL Running = TRUE;
SERVICE_STATUS_HANDLE hServiceStatus;
SERVICE_STATUS status;
SC_HANDLE hSCM;
int option(int argc, TCHAR* argv[])
{
hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (argc
if (_wcsicmp(argv[1], _T("-i")) == 0)
{
Install(a);
::CloseServiceHandle(hSCM);
return 1;
}
if (_wcsicmp(argv[1], _T("-u")) == 0)
{
Uninstall(a);
return 1;
}
return 0;
}
void Install(char *name ) //安装服务,实际上就是将该新服务的信息写入SCM管理的数据库中
{
if (!hSCM) return 0;
char szFilePath[260];
::GetModuleFileNameA(NULL, szFilePath, sizeof(szFilePath));
SC_HANDLE hService = ::CreateServiceA(hSCM,(LPCSTR)name,(LPCSTR)name,SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS,SERVICE_DEMAND_START,SERVICE_ERROR_NORMAL,szFilePath,NULL,NULL,NULL,NULL,NULL);
if (!hService) {
::CloseServiceHandle(hSCM);
return ;
}
char szKey[256];
HKEY hKey = NULL;
strcpy(szKey, "SYSTEM//CurrentControlSet//Services//EventLog//Application//");
strcat(szKey, name);
if (::RegCreateKeyA(HKEY_LOCAL_MACHINE, szKey, &hKey) != ERROR_SUCCESS) {
::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM);
return;
}
::RegSetValueEx(hKey,_T("EventMessageFile"),0,REG_EXPAND_SZ, (CONST BYTE*)szFilePath,strlen(szFilePath) + 1);
DWORD dwData = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | EVENTLOG_INFORMATION_TYPE;
::RegSetValueEx(hKey,_T("TypesSupported"),0,REG_DWORD,(CONST BYTE*)&dwData,sizeof(DWORD));::RegCloseKey(hKey);
::CloseServiceHandle(hService);
}
void Uninstall(char *name)
{
SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (!hSCM) return ;
SC_HANDLE hService = ::OpenServiceA(hSCM,name,DELETE);
if (hService) {
if (::DeleteService(hService))
::CloseServiceHandle(hService);
}
::CloseServiceHandle(hSCM);
}
static void WINAPI Handler(DWORD dwOpcode)
{ //注意是在这个Handler回调中处理的SCM发来的命令,这里要做的就是设置控制变量,间接改变服务的运行行为。
switch (dwOpcode) {
case SERVICE_CONTROL_STOP:
status.dwCurrentState = SERVICE_STOP_PENDING;
::SetServiceStatus(hServiceStatus, &status);
Running = FALSE;
break;
default:
break;
}
::SetServiceStatus(hServiceStatus, &status);
}
static void WINAPI ServiceMaina(DWORD dwArgc, LPTSTR* lpszArgv)
{
hServiceStatus = RegisterServiceCtrlHandlerA(a,Handler);
::SetServiceStatus(hServiceStatus, &status);
status.dwCurrentState = SERVICE_RUNNING;
::SetServiceStatus(hServiceStatus, &status);
while (Running)
{
//做具体的服务吧,就像这是一个普通的应用程序一样
}
status.dwCurrentState = SERVICE_STOP_PENDING;
::SetServiceStatus(hServiceStatus, &status);//最后告诉SCM,这个服务停止了。
}
void StartService()
{
SERVICE_TABLE_ENTRY st[] = {
{(LPWSTR)a, ServiceMain},{NULL, NULL}};
status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
status.dwCurrentState = SERVICE_STOPPED;
status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
status.dwWin32ExitCode = 0;
status.dwServiceSpecificExitCode = 0;
status.dwCheckPoint = 0;
status.dwWaitHint = 0;
::StartServiceCtrlDispatcher(st);//分派器开始,服务即将开始运行
}
int _tmain(int argc, _TCHAR* argv[])
{
if(!option(argc, argv))
{
StartService();
}
return 0;
}
看到在RegisterServiceCtrlHandlerA中注册的Handler了吧,Handler就相当于一个控制器,这个Handler就是负责接收和处理命令的,它和主服务在不同的线程当中,主服务也就是上面例子中的while循环线程可以旁若无人的做任何事情,控制变量是全局的,可以在别的线程被改变,这个变量控制着服务的关闭行为,一切就是这么简单。关于服务的调试,可以用远程调试的办法进行。
windows专门为服务这个东西设计了如此复杂的机制,看得出服务的重要性,不过也不一定,windows本身就是微核结构而且内部大量使用了C/S架构,它为任何东西单独设计一个机制都不足为奇。它的API相当复杂,之所以这样就使因为windows是面向用户的,而用户是很难缠的,因此其api就提供了很多策略性的东西,当然也就相对复杂,windows服务仅仅是其中的一块而已,不过即使这样,windows的设计者还是做的很不错,程序员几乎不用费力就可以完成一个服务框架,当然如果深入一些,还有更加复杂的,不过那就涉及到一个新机制了,这就是svchost,很熟悉吧,不过不说了,我不喜欢讨论网上一搜一堆的东西,我比较喜欢思想性的东西,最起码还可能遭到一些反驳...
分享到:
相关推荐
如果没有特别说明它们都与Windows 98、WindowsNT4.0及Windows 2000兼容,其中大部分也与Windows 95及WindowsNT 3.51兼容。 您可用CD—ROM的根目录下的安装程序来将CD-ROM中,的内容复制到硬盘里,也可只复制...
解决:在控制面板-管理工具-服务中启动Server服务。并设置“启动类型”为“自动”。 2,IP设置有误。 症状:双机之间无法互Ping,连接用的双绞线经过测试没有问题,没有安装防火墙。 解决:检查两台电脑的IP...
ASP.NET是由微软开发的一种服务器端Web应用程序框架,用于构建动态网站、Web应用程序和Web服务。它是.NET Framework的一部分,提供了一种高效、高性能的方式来创建和运行基于Web的应用程序。ASP.NET提供了丰富的控件...
Windows内核还涉及到了Windows NT系列的多个版本,包括Windows NT、Windows 2000、Windows XP、Windows Server 2003、Windows Vista和Windows Server 2008等。这些版本虽然在功能上有所差异,但它们共有的NT架构使得...
如果没有特别说明它们都与Windows 98、WindowsNT4.0及Windows 2000兼容,其中大部分也与Windows 95及WindowsNT 3.51兼容。 您可用CD—ROM的根目录下的安装程序来将CD-ROM中,的内容复制到硬盘里,也可只复制...
如果没有特别说明它们都与Windows 98、WindowsNT4.0及Windows 2000兼容,其中大部分也与Windows 95及WindowsNT 3.51兼容。 您可用CD—ROM的根目录下的安装程序来将CD-ROM中,的内容复制到硬盘里,也可只复制...
适用平台:Windows 9x/ME/NT/2000/2003/XP 功能简介: ----------------------------------------------------- “精准通” 智能网站分析系统,可以准确收集网站访客信息,快速生成500多个分析报表。在韩国网站...
NT2.5新增六大创新: 创新一:支持最新Windows Server2008、IIS7、Silverlight 2.0 beta2 <br>创新二:新增商品交易插件,社区系统自带应用插件化 <br>创新三:优化用户在线处理,提高负载能力,减少等待...
master分支中有两个主要版本的源代码:original_plus标记:以最小的更改引用Windows NT4上WinFile的源代码,以便它可以与Visual Studio一起编译并在当前Windows上运行。 现任硕士:包含我的观点
当计算机启动时,BIOS或UEFI首先加载MBR,MBR负责加载操作系统分区上的NTLDR(NT Loader),NTLDR接着读取BOOT.INI文件来确定加载哪个操作系统。此过程中的每个步骤都可能成为需要进行修改的地方。 #### 修改...
文章中还提到了1999年MindCraft公司所做的一项评测,其结果显示Windows NT在文件服务和网页服务性能方面领先Linux。然而,由于测试环境可能对NT进行了优化,而Linux机器未获得同等优化,这一结果饱受争议。除此之外...
单块式操作系统如DOS,层次式操作系统如UNIX和Novell NetWare,Client/Server模式如Mach和Microsoft Windows NT。 网络操作系统的功能: 网络操作系统除了应具有通常操作系统应有的处理机管理、存储器管理、设备...
- 工作站上常用的主流操作系统包括各种版本的Unix、Linux以及Windows NT等高级版本。 通过以上知识点的总结,我们可以更深入地理解计算机系统的各个组成部分及其工作原理。这对于学习计算机科学和技术非常有帮助。
正确的观点是D)互联的计算机是分布在不同地理位置的多台独立的自治计算机系统。 9. 网络操作系统的基本任务: 它的任务包括屏蔽资源差异,提供网络服务,管理共享资源,并提供安全性服务。正确答案是D)安全性服务...
23. **Windows NT与UNIX/Linux**:都可以作为网络服务器平台。 24. **RIP协议**:是路由信息协议,用于动态路由配置。 25. **网络结构核心**:强调了分层和协议标准的重要性。 26. **广域网拓扑**:再次确认广域网多...
SQL Server 2000以其客户机/服务器体系结构、图形化用户界面、丰富的编程接口、与Windows NT的深度集成、良好的跨平台伸缩性以及对Web技术的支持,成为理想的数据库选择。此外,开发环境选用了Windows 2000NT操作...
- **操作系统要求**:支持 Windows 98、Windows 2000、Windows XP 和 Windows NT 4.0 等操作系统,也支持 Solaris、HP-UX 和 AIX 等 Unix 平台。 - **存储空间需求**:总需 70MB 的客户端安装空间,数据库空间...
然而,在多任务处理能力方面,DOS远不如现代的多任务操作系统如Linux和Windows NT。 - **多任务处理的优势**:Linux作为一种多任务操作系统,在同时处理多个进程时表现出色。这意味着用户可以在同一时间运行多个...