[C] 자신과 동일한 프로세스 이름이 가동중인지 확인하는 코드 (중복 실행 차단)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <unistd.h>
int is_another_instance_running(const char *process_name, pid_t current_pid) {
DIR *dir;
struct dirent *entry;
FILE *fp;
char path[256], cmdline[256];
dir = opendir("/proc");
if (dir == NULL) {
perror("opendir");
return 0;
}
while ((entry = readdir(dir)) != NULL) {
if (entry->d_type == DT_DIR && atoi(entry->d_name) > 0) {
snprintf(path, sizeof(path), "/proc/%s/cmdline", entry->d_name);
fp = fopen(path, "r");
if (fp != NULL) {
if (fgets(cmdline, sizeof(cmdline), fp) != NULL) {
// 프로세스 이름이 같고 현재 프로세스가 아닌 경우
if (strstr(cmdline, process_name) != NULL && atoi(entry->d_name) != current_pid) {
fclose(fp);
closedir(dir);
return 1; // 다른 인스턴스가 실행 중임
}
}
fclose(fp);
}
}
}
closedir(dir);
return 0; // 다른 인스턴스가 실행 중이지 않음
}
int main(int argc, char *argv[]) {
pid_t current_pid = getpid(); // 현재 프로세스의 PID 가져오기
const char *process_name = argv[0]; // 자신의 실행 파일 이름
// 실행 파일 이름에서 경로 제거 (예: ./myprogram -> myprogram)
const char *base_name = strrchr(process_name, '/');
if (base_name) {
base_name++; // '/' 이후의 문자열을 사용
} else {
base_name = process_name; // 경로가 없는 경우 원래 이름 사용
}
if (is_another_instance_running(base_name, current_pid)) {
printf("이미 가동 중입니다. 프로그램을 종료합니다.\n");
} else {
printf("미가동 상태입니다. 프로그램을 시작합니다.\n");
// 여기에 프로그램의 메인 코드를 작성
while (1) {
sleep(10); // 예시로 무한 대기
}
}
return 0;
}
'프로그래밍 > C, C++' 카테고리의 다른 글
[C++] 파일쓰기 예제 (0) | 2023.12.11 |
---|---|
C/C++ 프로그레스바 (ProgressBar) (0) | 2023.06.16 |
[C/C++] int 를 char 또는 const char* 로 변환하기 (0) | 2022.06.30 |
C++ 프로그램 중복 실행 방지 (윈도우 기반) (0) | 2021.05.18 |
C++ 에서 구동 파일의 절대 경로 확인하기 (windows) (0) | 2021.05.17 |