有关游戏的部署方案总结(二)
来源:互联网 发布:淘宝劲舞团 编辑:程序博客网 时间:2024/06/06 02:47
目标:
实现一个具有监视、启动、关闭指定一些进程的Deamon守护Service程序。用来在分布式服务器部署时能够集中控制和查询状态。并且deamon一经投入,不用再修改。
1. Service标准流程(还是看MSN吧,不写了)
a.
b.
c.
d.
e.
2. CreateProcess
a. ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
没有置零,导致CreateProcess返回错误,错误码998
3. 关闭自己开启的进行使用TerminateProcess是不会调用析构进行安全的关闭的
安全关闭服务器的方法:
1.TerminateProcess 暴力,立即关闭所有的线程释放资源。强制关闭,无法抵挡
2.本进程调用ExitProcess, 能够释放资源,如DLL。不管是释放的过程中因为包含关系可能导致程序奔溃和死锁
3.PostThreadMessage,然后对应的程序根据消息进行释放
4.命名锁,进行激活则开始释放。可以在其他进程中通过名字激活。不过名字规则注意重名
5.系统基本消息Ctrl+C Ctrl+Break。类似PostThreadMessage,其实也是一种基本信号。不过系统自带,不用使用消息循环。可以使用SetConsoleHandler设置回调函数
总结:任何安全的关闭都是需要请求和应答配合的,否则无法完全安全关闭。除了Ctrl+Break默认是能够进行析构释放资源的。
4. 有关Window Service
Service本身的目的在于实现一种多个用户都可以正常运行的公共服务。所以常理不会设置具体的角色的,所以也就不能和用户的界面进行交互。存在一些设计上的安全问题。所以进行类似守护进行的deamon Service开发,应用Service就要保证这些思想。
如果进行进程重启之类的服务,则需要CreateService需要SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS,以设定可以与用户界面交互。并可以使用GenerateConsoleCtrlEvent给指定的console发送关闭信号。从而实现安全关闭。
另外由于Service本身是没有控制台的,如果直接创建子进程,则子进程也不会有控制台,GenerateConsoleCtrlEvent发送信息会返回6.所以需要在ServiceMain函数里面增加一个AllocConsole和FreeCosle的过程。如下:
if(AllocConsole() == FALSE)
{
pfile = fopen("log","a");
fprintf(pfile, "[Function:%s Line:%d]Alloc Failed:%d\n", __FUNCTION__, __LINE__, GetLastError());
fclose(pfile);
return -1;
}
pfile = fopen("log","a");
fprintf(pfile, "[Function:%s Line:%d]Main\n", __FUNCTION__, __LINE__);
fclose(pfile);
SERVICE_TABLE_ENTRY ServiceTable[2];
ServiceTable[0].lpServiceName =_T("MemoryStatus");
ServiceTable[0].lpServiceProc =ServiceMain;
ServiceTable[1].lpServiceName =NULL;
ServiceTable[1].lpServiceProc =NULL;
if(!StartServiceCtrlDispatcher(ServiceTable))
{
int a = GetLastError();
FILE* pfile = fopen("log","a");
fprintf(pfile, "[Function:%s Line:%d ]errorCode:%d\n", __FUNCTION__, __LINE__, a);
fclose(pfile);
}
if(FreeConsole() == FALSE)
{
pfile = fopen("log","a");
fprintf(pfile, "[Function:%s Line:%d]Free Failed:%d\n", __FUNCTION__, __LINE__, GetLastError());
fclose(pfile);
return -2;
}
return 0;
5. 有关一经部署,不能再更改的设计思考,部署思考的时候再写吧
- 有关游戏的部署方案总结(二)
- 有关游戏的部署方案总结
- 有关游戏的部署方案总结(三)
- crtmpserver的部署方案
- 游戏跨区的实践总结(二)
- 开源的PaaS方案:在OpenStack上部署CloudFoundry (二)部署OpenStack
- Unity开发安卓游戏(2):基于安卓游戏的优化方案总结!
- Unity开发安卓游戏(2):基于安卓游戏的优化方案总结!
- 有关Linux下的游戏
- 大数据部署方案研究比较总结
- Teamtalk 部署方案总结 作者:金亮
- 有关jdbc的总结
- 有关输入的总结
- 有关spl的总结
- 有关动画的总结
- 有关maven的总结
- 有关CoordinatorLayout的总结
- 有关路径的总结
- 关于虚拟地址空间
- 【linux】ubuntu11.10下各种问题以及解决方案
- 有关游戏的部署方案总结
- 修改图片上的文字步骤
- 根据数据决定选择那个checkbox
- 有关游戏的部署方案总结(二)
- SWT对话框属性详解
- Hibernate 批量插入、更新与删除
- 程序常用日志文件写入函数
- Android 绑定类型服务---简介
- SP2-1503: 无法初始化 Oracle 调用界面 SP2-1503: 无法初始化 Oracle 问题
- 有关游戏的部署方案总结(三)
- dom访问方法
- mysql