Linux下后台服务程序开发

来源:互联网 发布:登山装备知乎 编辑:程序博客网 时间:2024/06/05 05:02
 #include <sys/types.h>
    #include <sys/stat.h>
    #include <signal.h>
 
static volatile int  gIsExit = 1;                        /*程序退出标识*/
 
/*******************************************************************/
static void UsageInfo(const char * argv);   /*用法提示*/
static void CatchSignal(int signo);     /*捕捉信号*/
 
int main(int argc, char * argv[])
{
    //公用变量
    char sPidFileName[256];
    //文件控制变量
    struct stat fstat;
    pid_t Pid;
    FILE * fpPid;
    int ret = 0;
    int flag = 0;
    char buf[1024] = {0};
 
    if ( argc != 2 ) {
        UsageInfo(argv[0]);
        exit(0);
    }
 
    sprintf(sPidFileName, "/tmp/WDKMS.PID");
 
    if ( strcasecmp(argv[1],"stop") == 0 ) {
        if ( stat(sPidFileName, &fstat) < 0 ) {
            printf("[%s] isn't runing!/n", argv[0]);
            exit(0);
        }
        if ( fstat.st_uid != geteuid() ) {
            printf("stop failed!/n", argv[0]);
            exit(0);
        }
 
        if ( (fpPid = fopen(sPidFileName, "r")) == NULL ) {
            printf("open [%s] error!/n", argv[0]);
            exit(0);
        }
 
        fscanf(fpPid,"%d",&Pid);
        fclose(fpPid);
 
        printf("[%s] stoping....../n", argv[0]);
 
        if ( kill(Pid,SIGUSR1) != 0 ) {
            printf("[%s] send signal failed!/n", argv[0]);
            exit(0);
        }
 
        while ( stat(sPidFileName, &fstat)==0 ){
            printf("waiting.../n");
            apr_sleep(apr_time_from_sec(1));
        }
        printf("DONE!/n", argv[0]);
        exit(0);
    } else if ( strcasecmp(argv[1],"start") != 0 ) {
        UsageInfo(argv[0]);
        exit(0);
    }
 
    if ( stat(sPidFileName, &fstat)==0 ) {
        printf("[%s] is exist!/n", argv[0]);
        exit(0);
    } else {
        /* 将程序转入后台运行,成为守护程序 */
        if ( fork() > 0 ) exit(0);
        setsid();
        if ( fork() > 0 ) exit(0);
 
        /* 把本程序的pid写入 /tmp/HSMServer_pid 中*/
        if ( (fpPid = fopen(sPidFileName, "w")) == NULL ) {
            printf("create [%s] failed!", sPidFileName);
            exit(0);
        }
        Pid = getpid();
        fprintf(fpPid,"%d",Pid);
        fclose(fpPid);
    }
 
    if ( server_start("HSM.ini") != 0 ) {
        goto quit;
    }
 
    signal(SIGUSR1, CatchSignal);
   
    while ( gIsExit ) {
        apr_sleep(apr_time_from_sec(SLEEP_TIME)); 
    }
 
quit:
    server_close();
 
    KMS_LogEntry("main", "exit DONE", 0);
    if ( remove(sPidFileName) != 0 ) {
        printf("app exit! rm pid failed!/n");
    }
 
    return 0;
}
 
static void CatchSignal( int signo)
{
    gIsExit = 0;
    return;
}
 
static void UsageInfo(const char * argv)
{
    printf("Usage:/n/t %s start|stop/n",argv);
}
原创粉丝点击