一个后台运行程序的简单设计

来源:互联网 发布:传智大数据百度网盘 编辑:程序博客网 时间:2024/05/16 15:36

很多时候,我们都会遇到编写后台运行程序的问题。编写后台运行程序的主要工作并不在接口上,而是在其作为服务器程序所完成的实际工作上。由于编写过不少后台工作程序,最初总是为程序的后台工作接口而苦恼不已。在这里,我贴出相关的代码,相信根据此设计,读者可以轻易地把它应用到自己的后台程序中去。

假设程序名称为startup,那么程序启动的接口为:

Startup:  启动该程序   
Startup -v: 查看该程序的版本
Startup -d: 启动该程序,并将调试信息打印到debug文件中
Startup -h: 以后台方式启动应用程序
Startup -k: 停止后台应用程序的运行
Startup -l: 重新读取应用程序的配置文件

配置文件(startup.ini)的格式如下:
[SERVER]
DEBUG = 1

完整的实现如下:

Startup.h

#ifndef _STARTUP_H_
#define _STARTUP_H_

#define MAX_MSG_SIZE                1500
#define MAX_BUFFER_LEN                1024
#define MIN_BUFFER_LEN                256
#define MAX_FILE_NAME_LEN            MAX_BUFFER_LEN

#define CFG_PATH                    "Startup.ini"

void loadConfig();
void mprintf(const char *pszFormat,...);

#endif

Startup.cpp

#include "Startup.h"
#include 
<stdlib.h>
#include 
<Windows.h>

#include 
<iostream>

using namespace std;

HANDLE    hExitHandle    
= 0;
HANDLE    hLoadHandle    
= 0;
int        nDbgInfoPrt    = 0;

int main(int argc, char* argv[])
{
    
if (argc > 2)
    
{
        cout 
<< "Error, print "Startup -help" for usage." << endl;
        
return 0;
    }


    
if (argc == 2 && strcmp(argv[1], "-help"== 0)
    
{
        cout 
<< "Usage: Startup for starting up test." << endl;
        cout 
<< "-------------------------------------------" << endl;
        cout 
<< "Startup:    Start the application." << endl;
        cout 
<< "Startup -v: View the version." << endl;
        cout 
<< "Startup -d: Start the application in debug mode." << endl;
        cout 
<< "Startup -h: Start the application in hide mode." << endl;        
        cout 
<< "Startup -k: Stop the application running in hide mode." << endl;
        cout 
<< "Startup -l: Reload the config when running in hide mode." << endl;
        
return 0;
    }


    
if (argc == 2 && strcmp(argv[1], "-v"== 0)
    
{
        cout 
<< "Startup v1.0 for starting up test" << endl;
        
return 0;
    }


    
if (argc == 2 && strcmp(argv[1], "-d"== 0)
    
{
        nDbgInfoPrt 
= true;
        mprintf(
"Run application in debug mode!");
    }


    
if (argc == 2 && strcmp(argv[1], "-h" ) == 0)
    
{
        
//Run the program background
        char szPath[MAX_PATH] = 0 };
        STARTUPINFO si;
        PROCESS_INFORMATION pi;

        ZeroMemory(
&si, sizeof(si));
        si.cb 
= sizeof(si);
        ZeroMemory(
&pi, sizeof(pi));

        GetModuleFileName(NULL, (LPWCH)szPath, MAX_PATH);
        
if (!CreateProcess(NULL,                // No module name (use command line). 
                           (LPWSTR)szPath,        // Command line. 
                           NULL,                // Process handle not inheritable. 
                           NULL,                // Thread handle not inheritable. 
                           FALSE,                // Set handle inheritance to FALSE. 
                           CREATE_NO_WINDOW,    // No creation flags. 
                           NULL,                // Use parent's environment block. 
                           NULL,                // Use parent's starting directory. 
                           &si,                    // Pointer to STARTUPINFO structure.
                           &pi)                    // Pointer to PROCESS_INFORMATION structure.
            ) 
        
{
            cout 
<< "Failed in starting application, error code: " << GetLastError() << endl;
        }


        
return 0;
    }
    

    
if (argc == 2 && strcmp(argv[1], "-k"== 0)
    
{
        hExitHandle 
= OpenEvent(EVENT_ALL_ACCESS, FALSE, (LPCWSTR)"StartupKill");
        
if (NULL == hExitHandle)
        
{
            mprintf(
"Can't open kill event");            
            
return 0;
        }


        SetEvent(hExitHandle);
        
return 0;
    }


    
if (argc == 2 && strcmp(argv[1], "-l"== 0)
    
{
        hLoadHandle 
= OpenEvent(EVENT_ALL_ACCESS, FALSE, (LPCWSTR)"StartupLoad");
        
if (NULL == hLoadHandle)
        
{
            mprintf(
"Can't open load event");            
            
return 0;
        }


        SetEvent(hLoadHandle);
        
return 0;
    }


    hExitHandle 
= CreateEvent(NULL, TRUE, FALSE, (LPCWSTR)"StartupKill");
    
if (NULL == hExitHandle)
    
{
        mprintf(
"Can't create kill event");
        
return 0;
    }


    hLoadHandle 
= CreateEvent(NULL, TRUE, FALSE, (LPCWSTR)"StartupLoad");
    
if (NULL == hLoadHandle)
    
{
        mprintf(
"Can't create load event");
        
return 0;
    }


    
if (GetLastError() == ERROR_ALREADY_EXISTS)
    
{
        cout 
<< "Application has already started." << endl;
        
return 0;
    }


    
// load the configure information
    loadConfig();

    
for ( ; ; )
    
{
        
if (WaitForSingleObject(hExitHandle, 0!= WAIT_TIMEOUT)
        
{
            
break;
        }
    

        
if (WaitForSingleObject(hLoadHandle, 0!= WAIT_TIMEOUT)
        
{
            loadConfig();
        }

  
        
// TODO: do something here
        mprintf("The program is alive!");

        Sleep(
1000);
    }


    CloseHandle(hExitHandle);
    CloseHandle(hLoadHandle);

    
return 0;
}


///////////////////////////////////////////////////
//
// Description: load the configure from .ini file
// 
// Parameter: 
//    void == 
//
// Return:
//    void ==
//
///////////////////////////////////////////////////

void loadConfig()
{
    
// Get the configure info from Startup.ini    
    nDbgInfoPrt = GetPrivateProfileInt((LPCWSTR)"SERVER", (LPCWSTR)"DEBUG",     0,    (LPCWSTR)CFG_PATH);
}



///////////////////////////////////////////////////
//
// Description: print the msg
// 
// Parameter: 
//    const char *pszFormat == 
//
// Return:
//    void ==
//
///////////////////////////////////////////////////

void mprintf(const char *pszFormat,...)
{
    
if (!nDbgInfoPrt)
    
{
        
return;
    }


    va_list vaArg;
    va_start(vaArg, pszFormat);    

    
char szDbgInfo[MAX_BUFFER_LEN + 1= {0, };
    vsprintf_s(szDbgInfo, pszFormat, vaArg);

    va_end(vaArg);

    cout 
<< szDbgInfo << endl;
}

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 刹车油进眼睛里怎么办 眼睛被uv灯刺伤怎么办 眼睛被uv灯伤了怎么办 洗手台靠不到墙怎么办 加盟天猫优品不想干了怎么办 口袋侦探点开始就闪退怎么办 淘宝号被监控了怎么办 excel表格中把字体变细怎么办 wps方框中打字打不上怎么办 蘑菇街里面买东西受骗了怎么办? 淘宝买家号账户体检中心违规怎么办 支付宝充错手机账号怎么办 美团恶意差评怎么办 买家好评后追加差评怎么办 宝贝吃了一个金币怎么办 店铺微淘等级l1怎么办 淘宝占内存2个g怎么办 淘宝太占空间了怎么办 支付宝占内存大怎么办 苹果手机储存空间不足怎么办 小米平板电脑储存空间不足怎么办 ipad2很卡反应慢怎么办 ipadmini很卡反应慢怎么办 手机酷狗音乐文件不支持怎么办 2018款ipad闪退怎么办 ipad开不了机了怎么办 淘宝盖楼上限了怎么办 交了学费做微淘客却加不到人怎么办 微淘客交首付不想做了怎么办 蚂蚁微客二维码推广怎么办 游拍主播申请手机号被注册怎么办 淘宝客不给力怎么办 淘宝买家确认收货超时怎么办 淘宝没收到货退款卖家不处理怎么办 微博红包都是字怎么办 500个访客没转化怎么办 店铺动态评分是0怎么办 京东店铺评分低怎么办 被淘宝主播屏蔽怎么办 在淘宝客推广后退款怎么办 生产出现异常时你应该怎么办