Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

소개

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);
	}
}