HRESULT RemoteDebuggerProxy::Start() { if ( mSessionGuid != GUID_NULL ) return S_OK; HRESULT hr = S_OK; GUID sessionGuid = { 0 }; wchar_t sessionGuidStr[GUID_LENGTH + 1] = L""; int ret = 0; hr = CoCreateGuid( &sessionGuid ); if ( FAILED( hr ) ) return hr; ret = StringFromGUID2( sessionGuid, sessionGuidStr, _countof( sessionGuidStr ) ); _ASSERT( ret > 0 ); if ( ret == 0 ) return E_FAIL; mSessionGuid = sessionGuid; hr = StartAgent( sessionGuidStr ); if ( FAILED( hr ) ) return hr; hr = StartServer( sessionGuidStr ); if ( FAILED( hr ) ) return hr; SetRemoteEventCallback( this ); hr = StartClient( sessionGuidStr, sessionGuid, mhContext ); SetRemoteEventCallback( NULL ); if ( FAILED( hr ) ) { StopServer(); return hr; } return S_OK; }
//////////////////////////////////////////////////////////////////////// // 描 述: 启动应用程序 // 作 者: 邵凯田 // 创建时间: 2008-10-10 14:17 // 参数说明: @argc/argv为main输入参数 // @szDate/szTime为编译日期时间 // @bBlock为是否阻塞运行,true为阻塞,false为不阻塞 // 返 回 值: true/false ////////////////////////////////////////////////////////////////////////// bool SApplication::Run(int argc, char* argv[],const char* szDate,const char* szTime,bool bBlock/*=true*/) { m_iArgc = argc; m_ppArgv = (char**)argv; m_sModule = argv[0]; #ifndef _WITHOUT_AGENT_CHANNEL_ m_sAgentIp = "127.0.0.1"; #endif SString err; SString crc = SApi::GenerateCRCByFile(m_sModule,err); m_sModuleCrc = crc; m_sModuleTime.sprintf("%s %s",szDate,szTime); if(m_sModule.findRev('/') >= 0) m_sModule = m_sModule.mid(m_sModule.findRev('/')+1); if(m_sModule.findRev('\\') >= 0) m_sModule = m_sModule.mid(m_sModule.findRev('\\')+1); printf("#########################################################\n"); printf("## SKTBASE Application frame\n"); printf("## Module Name: %s \n",m_sModule.data()); printf("## Description : %s \n",m_sModuleDesc.data()); printf("## Compile Time: %s %s\n",szDate,szTime); printf("## Appbase Ver : V%s \n",m_sAppbaseVer.data()); printf("## Module Ver : V%s \n",m_sModuleVer.data()); printf("## CRC Code : %s \n",crc.data()); printf("#########################################################\n"); SString sTemp=""; if(IsParam("version",sTemp)) { bool bWrite = false; SString sLine; SFile file; if(sTemp.length() > 0) { file.setFileName(sTemp); if(file.open(IO_Truncate)) bWrite = true; } if(bWrite) { sLine.sprintf("#########################################################\n"); file.writeString(sLine); sLine.sprintf("## SKTBASE Application frame\n"); file.writeString(sLine); sLine.sprintf("## Module Name: %s \n",m_sModule.data()); file.writeString(sLine); sLine.sprintf("## Description : %s \n",m_sModuleDesc.data()); file.writeString(sLine); sLine.sprintf("## Compile Time: %s %s\n",szDate,szTime); file.writeString(sLine); sLine.sprintf("## Appbase Ver : V%s \n",m_sAppbaseVer.data()); file.writeString(sLine); sLine.sprintf("## Module Ver : V%s \n",m_sModuleVer.data()); file.writeString(sLine); sLine.sprintf("## CRC Code : %s \n",crc.data()); file.writeString(sLine); sLine.sprintf("#########################################################\n"); file.writeString(sLine); file.close(); } exit(0); abort(); } if(m_sModuleDesc.length() == 0) { printf("ERROR!!! 缺少模块描述信息!请调用基类CSRecApplication::SetModuleDesc方法!\n\n\n"); } if(m_sModuleVer.length() == 0) { printf("ERROR!!! 缺少模块版本信息!请调用基类CSRecApplication::SetVersion方法!\n\n\n"); } #ifndef WIN32 signal(SIGPIPE,SIG_IGN);//忽略管道断开信号 signal(SIGCHLD,SIG_IGN); signal(SIGCLD, SIG_IGN); #endif #ifndef WIN32 if(m_bFork) { //LINUX下将进程设置为守护进程 //printf("@@@@@@@@@@@@begin fork()\n"); if(fork()) { //printf("@@@@@@@@@@@@fork()\n"); exit(0); } } SApi::UsSleep(100000); signal(SIGCHLD,SIG_IGN); #endif SLog::setLogLevel(SLog::LOG_DEBUG); SLog::setModuleName(m_sModule.data()); //预处理命令 SXmlConfig xml; SString sFileName; m_sExePath = SDir::currentDirPath(); if(m_sExePath.right(1) != "/" && m_sExePath.right(1) != "\\") m_sExePath += "/"; sFileName=m_sExePath + "logconfig.xml"; if(!xml.ReadConfig(sFileName)) { LOGWARN("打开<logconfig.xml>文件失败!将无法使用日志记录功能! file=%s",sFileName.data()); } else { sFileName = m_sModule; SBaseConfig *pPrecommand = xml.SearchChild("log<module='"+sFileName+"'>"); if(pPrecommand == NULL) { if(sFileName.right(4).toLower() == ".exe") sFileName = sFileName.left(sFileName.length()-4); pPrecommand = xml.SearchChild("log<module='"+sFileName+"'>"); } if(pPrecommand == NULL) { //没有专用的,找缺省的 pPrecommand = xml.SearchChild("log<module=''>"); } if(pPrecommand != NULL) { //预处理命令 int i,cnt = pPrecommand==NULL?0:pPrecommand->GetChildCount("command"); for(i=0;i<cnt;i++) { SBaseConfig *pCommand = pPrecommand->GetChildNode(i,"command"); if(pCommand == NULL ) continue; SString cmd = pCommand->GetNodeValue(); if(cmd.find("[@modulename]") >= 0) { SString sModule = SLog::getModuleName(); cmd = cmd.replace("[@modulename]",sModule); } ParseCommandLine(cmd); } } } //是否处于调试模式 if(IsParam("debug")) m_bDebugMode = true; if(IsParam("console",sTemp)) { sTemp = sTemp.toLower(); if(sTemp == "off") { //强制关闭控制台的日志输出 m_bLogToConsole = false; ParseCommandLine("log to console off"); } } #ifndef _WITHOUT_AGENT_CHANNEL_ if(IsParam("agentport",sTemp)) { m_iAgentPort = sTemp.toInt(); if(m_iAgentPort == 0) m_iAgentPort = 6666; } #endif if(IsParam("stop")) { if(!_Stop()) { LOGFAULT("停止应用失败!"); //SLog::WaitForLogEmpty(); return false; } return true; } else if(IsParam("restart")) { _Stop(); if(!_Start()) { LOGFAULT("启动应用失败!"); //SLog::WaitForLogEmpty(); return false; } } else { if(!_Start()) { LOGFAULT("启动应用失败!"); //SLog::WaitForLogEmpty(); return false; } } LOGDEBUG("应用服务启动完成!"); if(bBlock) { //阻塞方式运行 #ifndef _WITHOUT_AGENT_CHANNEL_ StartAgent(bBlock); #else while(!m_bHalt) { //等待有人发出退出信号 if(IsClosedExist()) { LOGWARN("收到退出信号! 准备关闭当前进程!"); Stop(); //准备关闭当前进程 this->RemoveClose(); break; } SApi::UsSleep(2000000); } #endif } else { //非阻塞方式运行 #ifndef _WITHOUT_AGENT_CHANNEL_ StartAgent(bBlock); #endif } LOGDEBUG("应用服务已退出!"); //SLog::WaitForLogEmpty(); return true; }
// --------------------------------------------------------------------------- // int main() // // the entry of x_agent. // --------------------------------------------------------------------------- // int main(int argc, char* argv[]) { spt_init(argc, argv); int ch; bool isRunDeamon = false; string configFile("./agent.ini"); while((ch = getopt(argc, argv, "c:l:dvh")) != -1) { switch(ch) { case 'c': { if (optarg) { configFile = optarg; } } break; case 'd': { isRunDeamon = true; } break; case 'l': { if (optarg) { int loglevel = atoi(optarg); loglevel = loglevel == 0 ? 2 : loglevel; CSingleton<CLogWriter>::Instance()->SetLogLevel(loglevel); } } break; default: { if (ch == 'v' || (optarg && strcmp(optarg, "-v") == 0)) { fprintf(stderr, "%s version: %s, compile-time: %s\n", argv[0], FullVersion, CompileInfo); } else if (ch == 'h' || (optarg && strcmp(optarg, "-h") == 0)) { fprintf(stderr,"%s", HelpMsg); } else { fprintf(stderr,"\tError:%s -h for help.\n", argv[0]); } fflush(stderr); fflush(stdout); _exit(0); } break; } } // run by daemon mode. if (isRunDeamon) { wyf::DaemonMode(); } //register signal func atexit(before_exit); CatchSignal(); setproctitle("%s:Master.%d", argv[0], getpid()); do { int childPid = fork(); if (childPid == 0) { setsid(); atexit(before_exit); setproctitle("%s:%s", argv[0], "Worker."); CatchSignal(); // child process. StartAgent(configFile); _exit(0); } else if (childPid > 0) { LOG(LL_ERROR, "Start agent worker process:(%lu).", childPid); int checkTimes = 3; do { sleep(1); if (kill(childPid, 0) == 0) { // child exist... checkTimes = 3; sleep(5); } } while (checkTimes-- > 0); LOG(LL_ERROR, "agent worker process:(%lu) exit, try to start again.", childPid); } sleep(1); } while (1); return RET_OK; }