现在的位置: 首页 > 综合 > 正文

有关游戏的部署方案总结(二)

2013年10月22日 ⁄ 综合 ⁄ 共 2030字 ⁄ 字号 评论关闭

目标:
 实现一个具有监视、启动、关闭指定一些进程的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. 有关一经部署,不能再更改的设计思考,部署思考的时候再写吧

抱歉!评论已关闭.