守候進程main函數模版及linux守護寫法

本文旨在提供守護程序(包括windows,linux)的main函數的模版。

此模版內同時包含Linux守護進程的編寫方法。


代碼如下

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#ifdef WIN32

#else
#include <signal.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <sys/resource.h>
#endif//WIN32

#define VERSION_NO "1.0"

int RunProgram()
{
    printf("i am running\n");

    // do while loop
    

    return 0;
}

#ifdef WIN32
int RunDaemon()
{
    //1 run windows daemon

    //2 use CreateMutex to make sure program have only one instance

    //3 RunProgram
    RunProgram();

    return 0;
}

#else

int RunDaemon()
{
    struct sigaction act;
    struct rlimit    rl;

    //
    pid_t processID      = 0;
    int   status         = 0;
    int   pid            = 0;

    // ignore signal
    act.sa_flags = 0;
    act.sa_handler = SIG_IGN;
    (void)::sigaction(SIGPIPE,  &act, NULL);
    (void)::sigaction(SIGHUP,   &act, NULL);
    (void)::sigaction(SIGINT,   &act, NULL);
    (void)::sigaction(SIGTERM,  &act, NULL);
    (void)::sigaction(SIGQUIT,  &act, NULL);
    (void)::sigaction(SIGALRM,  &act, NULL);
    
    //set max file handle count
    rl.rlim_cur = 10240;
    rl.rlim_max = 10240;
    setrlimit(RLIMIT_NOFILE, &rl);
    
    //set core dump size
    rl.rlim_cur = RLIM_INFINITY;
    rl.rlim_max = RLIM_INFINITY;
    setrlimit(RLIMIT_CORE, &rl);

    //run in background
    if (daemon(0,0) != 0)
    {
        exit(-1);
    }
    
    while(true)
    {
        processID = fork();
        if(processID > 0)
        {
            status = 0;
            while(status==0)
            {
                pid =::wait(&status);
                int exitStatus = WEXITSTATUS(status);
                if(WIFEXITED(status) && pid > 0 && status != 0)
                {
                    if(exitStatus == -1)
                    {
                        printf("child exit\r\n");
                        exit(EXIT_FAILURE); 
                    }
                    printf("[RunDaemon] - WIFEXITED\r\n");
                    break;
                }
                if(WIFSIGNALED(status))
                {
                    printf("[RunDaemon] - WIFSIGNALED\r\n");
                    break;
                }
                if(WIFSTOPPED(status))
                {
                    printf("[RunDaemon] - WIFSTOPPED\r\n");
                    break;
                }
                if(pid == -1 && status == 0)
                {
                    continue;
                }
                if(pid > 0 && status == 0)
                {
                    printf("[RunDaemon] - status == 0\r\n");
                    exit(EXIT_SUCCESS);
                }
                printf("[RunDaemon] - EXIT_FAILURE\r\n");
                exit(EXIT_FAILURE);
            }
        }
        else if(processID == 0)
        {
            break;
        }
        else
        {
            exit(EXIT_FAILURE);
        }
        sleep(1);
    }

    if(processID != 0)
    {
        exit(EXIT_SUCCESS); 
    }
    else
    {
        RunProgram();
    }

    return 0;
}

#endif//WIN32

int main(int argc, char *argv[])
{
    bool bExit = false;

    if (
        (argc >= 2)
        && (strcmp(argv[1], "-v") == 0)
       )
    {
        printf("MyProgram %s %s %s\r\n", VERSION_NO, __DATE__, __TIME__);
        bExit = true;
    }

    if (!bExit)
    {
        RunDaemon();
    }

    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章