C语言编写的Windows服务程序,可以类比Linux/Unix环境下的daemon进程。

一下是VS2010环境下的demo:

// windows_service.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include

#include

#define SLEEP_TIME 5000 /*间隔时间*/

#define LOGFILE "D:\\log.txt" /*信息输出文件*/

SERVICE_STATUS ServiceStatus; /*服务状态*/

SERVICE_STATUS_HANDLE hStatus; /*服务状态句柄*/

void ServiceMain(int argc, char** argv);

void CtrlHandler(DWORD request);

int InitService();

int _tmain(int argc, _TCHAR* argv[])

{

SERVICE_TABLE_ENTRY ServiceTable[2];

ServiceTable[0].lpServiceName="Monitor";

ServiceTable[0].lpServiceProc=(LPSERVICE_MAIN_FUNCTION)ServiceMain;

ServiceTable[1].lpServiceName=NULL;

ServiceTable[1].lpServiceProc=NULL;

StartServiceCtrlDispatcher(ServiceTable);

return 0;

}

int WriteToLog(char* str)

{

FILE* pfile;

fopen_s(&pfile,LOGFILE,"a+");

if (pfile==NULL)

{

return -1;

}

fprintf_s(pfile,"%s\n",str);

fclose(pfile);

return 0;

}

/*Service initialization*/

int InitService()

{

OutputDebugString("Monitoring started.");

int result;

result = WriteToLog("Monitoring started.");

return(result);

}

/*Control Handler*/

void CtrlHandler(DWORD request)

{

switch (request)

{

case SERVICE_CONTROL_STOP:

OutputDebugString("Monitoring stopped.");

WriteToLog("Monitoring stopped.");

ServiceStatus.dwWin32ExitCode = 0;

ServiceStatus.dwCurrentState = SERVICE_STOPPED;

SetServiceStatus (hStatus, &ServiceStatus);

return;

case SERVICE_CONTROL_SHUTDOWN:

OutputDebugString("Monitoring stopped.");

WriteToLog("Monitoring stopped.");

ServiceStatus.dwWin32ExitCode = 0;

ServiceStatus.dwCurrentState = SERVICE_STOPPED;

SetServiceStatus (hStatus, &ServiceStatus);

return;

default:

break;

}

/* Report current status */

SetServiceStatus (hStatus, &ServiceStatus);

return;

}

void ServiceMain(int argc, char** argv)

{

int error;

ServiceStatus.dwServiceType =

SERVICE_WIN32;

ServiceStatus.dwCurrentState =

SERVICE_START_PENDING;

/*在本例中只接受系统关机和停止服务两种控制命令*/

ServiceStatus.dwControlsAccepted =

SERVICE_ACCEPT_SHUTDOWN |

SERVICE_ACCEPT_STOP;

ServiceStatus.dwWin32ExitCode = 0;

ServiceStatus.dwServiceSpecificExitCode = 0;

ServiceStatus.dwCheckPoint = 0;

ServiceStatus.dwWaitHint = 0;

hStatus = ::RegisterServiceCtrlHandler(

"Monitor",

(LPHANDLER_FUNCTION)CtrlHandler);

if (hStatus == (SERVICE_STATUS_HANDLE)0)

{

WriteToLog("RegisterServiceCtrlHandler failed");

return;

}

WriteToLog("RegisterServiceCtrlHandler success");

/* Initialize Service */

error = InitService();

if (error)

{

/* Initialization failed */

ServiceStatus.dwCurrentState =

SERVICE_STOPPED;

ServiceStatus.dwWin32ExitCode = -1;

SetServiceStatus(hStatus, &ServiceStatus);

return;

}

/*向SCM 报告运行状态*/

ServiceStatus.dwCurrentState =

SERVICE_RUNNING;

SetServiceStatus (hStatus, &ServiceStatus);

/*do something you want to do in this while loop*/

MEMORYSTATUS memstatus;

while (ServiceStatus.dwCurrentState ==

SERVICE_RUNNING)

{

char buffer[16];

GlobalMemoryStatus(&memstatus);

int availmb = memstatus.dwAvailPhys/1024/1024;

sprintf_s(buffer,100,"available memory is %dMB",availmb);

OutputDebugString(buffer);

int result = WriteToLog(buffer);

if (result)

{

ServiceStatus.dwCurrentState =

SERVICE_STOPPED;

ServiceStatus.dwWin32ExitCode = -1;

SetServiceStatus(hStatus,

&ServiceStatus);

return;

}

Sleep(SLEEP_TIME);

}

WriteToLog("service stopped");

return;

}注册&启动服务的bat脚本:

sc create Monitor binpath= D:\test\windows_service.exe

sc start Monitor请注意binpath= 后面的空格符,空格符缺失则无法创建服务。

停止和删除服务的命令如下:

sc stop Monitor

sc delete Monitor

作者:super_bert@csdn

c语言编写系统服务程序,C语言Windows服务程序编写-ServiceMain相关推荐

  1. win8编程c语言,Win8系统怎么运行C语言 win8系统运行C语言的方法

    C语言是一门通用计算机编程语言,是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言,但是许多win8系统用户并不知道要怎么运行C语言,针对这个情 ...

  2. 停车场编码C语言,停车场系统部分C语言代码

    停车场系统部分C语言代码 (2011-05-24 16:13:41) 标签: 车牌号 层号 停车场系统 位号 停车场管理 it #include #include #include struct Ga ...

  3. c语言使用系统,使用C语言入门

    全部展开 逐步学习任何知识始终是最好的方法. 不幸的是,许都知道这个道理,但总是想走所谓的捷径. 如果您是刚刚开始学习编程的中学生,或者是刚刚进入计算机e68a84e8a2ade799bee5baa6 ...

  4. c语言期末系统答辩,C语言期末项目答辩实施方案.doc-资源下载人人文库网

    <C语言>期末项目答辩实施方案.doc C语言程序设计课程期末项目答辩考核实施方案1. 考核目的:C语言程序设计是理论与实践并存的一门课程.通过项目答辩的方式考核,旨在考察学生对课程知识掌 ...

  5. 佳能 c3000 系统设置改语言,win7如何更改语言 win7系统中将电脑语言改成英文的方法步骤介绍...

    今年evad3rs团队发布的iOS 7完美越狱工具有些特殊,中国版iOS7完美越狱工具中,捆绑有太极助手插件,此插件类似流氓插件,容易导致iOS越狱设备出现白苹果现象(国外版无此插件).所以就出现了一 ...

  6. 郑州大学c语言考试系统,郑州大学c语言考试机真题.doc

    [HNCE网上考试系统 v9.6]??本套软件使用权属于:郑州大学 考试课程:? 考试时间:100分钟? 考场:第一考场? 考试日期:2013.05.24 考号:20122234567? ?姓名: 剩 ...

  7. C语言数据处理系统程序,c语言程序设计~用高级语言实现篮球联赛个人技术数据处理系统.doc...

    c语言程序设计~用高级语言实现篮球联赛个人技术数据处理系统 匣烈同芳僧块搁拇掂犀均钒俭展边劣卸粮噪执挪宽由陌乳刽沉匡澈否辐狐损铸己涣讨前颇呼鹃使琳滤掩遁仟壁涨触乱牙敏堆蔚讳准那箕女垦点摧污劈汞憾令跃嫌 ...

  8. c语言学校系统,基于C语言的学校书管理系统.doc

    基于C语言的学校书管理系统 本科学生毕业论文(设计) 题目(中 文):基于C语言的学校图书管理系统(英 文):School Library Management System Based on C L ...

  9. c 语言登录系统源代码,c语言源代码---------------个人图书管理系统

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 printf( "\30\30\30\30\30\30\30\30\30\30\30\30\30\30\30\30\30\30\30\30\30 ...

  10. C语言储蓄系统编程,C语言:银行储蓄系统的开发(初级)-Go语言中文社区

    任务代码: #include #include int main() { printf("欢迎来到鄞州银行!nn"); /*变量定义*/ int iPass;//用户输入的密码 i ...

最新文章

  1. linux命令下怎么保存python_Linux 环境下安装 Python3 的操作方法
  2. FreeSWITCH中文语音包
  3. python连连看_python tkinter实现连连看游戏
  4. FM实现F4帮助系列三:弹出框多筛选…
  5. golang操作mysql数据库(Go-SQL-Driver/MySQL)
  6. graphpad数据小数点_GraphPad Prism 统计指南 | 关于异常值(Outlier),你真的了解吗?...
  7. Linux能ping主机,但ping不了网关以及外网,显示包全丢失解决方案
  8. 标准C程序设计七---121
  9. WPS有空白页老删不掉,delete和退格都删不了
  10. Guideline 5.1.1 - Legal - Privacy - Data Collection and Storage We noticed that your app requires
  11. wifi大师小程序独立版3.0.8源码
  12. CppPrimer 学习笔记(1)
  13. linux spark单节点环境搭建,Linux下基于Hadoop的Spark1.2单机安装
  14. ZB雕刻用鼠标和数位板的差别大不大?怎么买手绘板?ZB雕刻手绘是不是很重要?
  15. OR值的意义和计算公式,和95% CI
  16. python富翁与穷人_富人家的孩子怎样看待穷人家的孩子?
  17. 多线程下载图片并压缩
  18. 关于魔兽世界封号机制的数据统计
  19. tensorflow测试GPU可用
  20. 芯昇 CM32M101A 固件库 W25Q128JWSIQ 驱动

热门文章

  1. 青羊区光华中心机器人_北京大学招收机器人工程本科生
  2. 【RocketMQ工作原理】消息堆积与消费延迟
  3. Spring Cloud Alibaba 之 服务通信 REST消息通信:如何使用 OpenFeign 简化服务间通信
  4. IDEA 中比较骚后缀补全技巧!你可能没用过
  5. matlab 二阶非线性微分方程组,二阶非线性常微分方程的打靶法matlab实现.doc
  6. Dockerfile镜像优化方案指引
  7. python加号换行,Python字符串拼接六种方法介绍
  8. mysql 开仓函数_MySQL函数大全 及用法示例
  9. java 并行多线程素数,多线程求求1000万内的质数数量
  10. python美国股票数据api_【美股量化00篇】Python获取新浪接口美股实时数据