linuxデーモン

3250 ワード

1.デーモンプロセスは1つしか存在しません.
2.デーモンプロセスによってサービスプログラムを引き上げ、wait;
3.サービスプロセスが終了すると、デーモンプロセスは再びサービスプログラムを引き上げ、このように繰り返す.
コードは次のとおりです.
#include<sys/types.h> 
#include<sys/wait.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>

#define RUN_APP_PATH                "./a.out"
#define PARA_0                      "start"
#define PARA_1                      ""

#define SELF_APP_NAME               "pup_daemon"

int getProcessRunningCount(const char * pName)
{
        FILE* fp = 0; 
        int  iCount = -1; 
        char buf[1024] = {0}; 
        char command[1024] = {0};

        if(0 == pName)
                return -1;        

        sprintf(command, "ps -C %s|wc -l", pName ); 

        if((fp = popen(command,"r")) == NULL) 
        {
                printf("[getProcessRunningCount] popen error ......  \r
"); return -1; } if( (fgets(buf, 1024, fp)) != NULL ) { iCount = atoi(buf); } pclose(fp); return iCount; } int runDaemon() { int iRunningCount = getProcessRunningCount(SELF_APP_NAME); printf("Running count is %d ... \r
", iRunningCount); if(0 > iRunningCount) { printf("[getProcessRunningCount] err ... \r
"); return 0; } if(2 < iRunningCount) { printf("App is already running ... \r
"); return 0; } pid_t pid = -1; while(1) { pid = fork(); if (pid < 0) { fprintf(stderr, "error!"); usleep(1000 * 1000); continue; } else if( 0 == pid ) { if( 0 > execl(RUN_APP_PATH, PARA_0, PARA_1, (char*)0) ) { printf("execl err \r
"); } printf("This is the child process! \r
"); return 0; } else { printf("This is the parent process! child process id = %d \r
", pid); } wait(0); usleep(1000 * 3000); } return 0; } int main(int argc, char ** argv ) { for(int i = 0; i < argc; ++i) { printf("para is %s \r
", argv[i]); } runDaemon(); return 0; }