Damon(12) 프로그램을 만들다 보면, 이전에 동일한 프로세스가 떠있는지 확인을 해서, 떠있을 경우 바로 프로그램이 종료되도록 하는 코드를 넣어야할 필요가 있습니다. 이러한 경우 사용가능 한 간단한 함수 입니다. 다음과 같은 프로세스로 작동합니다.
이 코드는 리눅스(12) kernel(12) 2.6에서 테스트되었습니다. 아마도 2.2, 2.4에서도 잘돌아갈 것으로 생각됩니다.
+------+
| 시작 |
+------+
|
+------------+
| Pid |
| 파일 체크 |
+------------+
|
+-----------------------+ Yes
| Pid 파일이 존재하는가 | ---------> 종료
+-----------------------+
| NO
|
+------------------------+ Yes
| 해당 PID의 /proc파일이 | --------> 종료
| 존재하는가 |
+------------------------+
| NO
|
+------------------------+
| 자신의 PID로 |
| Pid 파일을 덮어씀 |
+------------------------+
|
|
|
소개
+------+ | 시작 | +------+ | +------------+ | 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); } }Recent Posts
Archive Posts
Tags