linuxデーモン
3250 ワード
1.デーモンプロセスは1つしか存在しません.
2.デーモンプロセスによってサービスプログラムを引き上げ、wait;
3.サービスプロセスが終了すると、デーモンプロセスは再びサービスプログラムを引き上げ、このように繰り返す.
コードは次のとおりです.
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;
}