본문 바로가기

UNIX_LINUX_C_C++

[펌] 프로그램이 이미 떠있는지 확인

Damon(12) 프로그램을 만들다 보면, 이전에 동일한 프로세스가 떠있는지 확인을 해서, 떠있을 경우 바로 프로그램이 종료되도록 하는 코드를 넣어야할 필요가 있습니다. 이러한 경우 사용가능 한 간단한 함수 입니다. 다음과 같은 프로세스로 작동합니다.

이 코드는 리눅스(12) kernel(12) 2.6에서 테스트되었습니다. 아마도 2.2, 2.4에서도 잘돌아갈 것으로 생각됩니다.
   +------+   | 시작 |   +------+      |    +------------+   | Pid        |   | 파일 체크  |   +------------+      |   +-----------------------+   Yes   | Pid 파일이 존재하는가 | ---------> 종료   +-----------------------+      | NO      |   +------------------------+  Yes   | 해당 PID의 /proc파일이 | --------> 종료   | 존재하는가             |   +------------------------+      | NO      |   +------------------------+   | 자신의 PID로           |   | Pid 파일을 덮어씀      |   +------------------------+      |      |      |

코드

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>int CheckProcess(char *pfile){    FILE *fp;    char pid[16];    char process[256];    int rtv = 0;    fp = fopen(pfile, "r");    if (fp == NULL)    {        return 0;    }    if (fgets(pid, sizeof(pid) - 1, fp) == NULL)     {        fclose(fp);        return 0;    }    fclose(fp);    pid[strlen(pid)-1] = 0x00;    sprintf(process, "/proc/%s/exe", pid);    if (access(process, F_OK) == 0)    {        return atoi(pid);    }    return 0;}int WritePid(char *pfile){    FILE *fp;    char pid[16];    sprintf(pid, "%d\n", getpid());    fp = fopen(pfile,"w");    fputs(pid, fp);    fclose(fp);}

사용방법

int main(int argc, char **argv){    int pid;    if ((pid = CheckProcess("/tmp/test.pid")) == 0)    {        printf("Damon exe\n");        WritePid("/tmp/test.pid");        while(1)        {            sleep(1);        }    }    else    {        printf("Damon is Exist %d\n", pid);    }}