2012-09-06 4 views
4

어떻게 인스턴스를 실행하도록 프로그램을 제한 할 수 있습니까? 현재 나는 데몬 (시작과 자동 멈춤)으로 프로그램을 돌리고 있는데, 사용자가 클릭하여 다시 시작하려고 할 때 (유효한 유즈 케이스가 아님), 프로세스는 사용자 컨텍스트에서 시작되고 나는 이것을 여러 가지 이유로 피하고 싶다. .실행중인 프로그램 인스턴스 하나만 허용

어떻게하면됩니까?

지금부터는 프로세스 목록을 얻고 몇 가지 검사를하고 시작 자체에서 빠져 나오지 만이 방법은 문제가되지 않지만 깨끗하지는 않습니다.

누군가가 나에게 더 나은 해결책을 줄 수 있습니까? 그리고 ps를 사용하여 프로세스 목록을 얻었습니다. 신뢰할 수있는 API가 있습니까?

+0

프로세스의 첫 번째 실행시 일부 파일을 잠글 수 있으며 이후에 실행될 때 파일이 이미 잠긴 경우 실행을 거부 할 수 있습니다 ('flock (2)'참조) – Guillaume

+0

생성 될 수 있습니다. 데몬이 충돌 할 때의 문제? – rplusg

+0

Mac OS X에서'fnctl'에 대한 맨 페이지는 "프로세스가 종료되면 주어진 프로세스의 파일과 관련된 모든 잠금이 제거됩니다."라고 말합니다. 따라서 충돌이 발생할 경우 안전 할 것이라고 생각합니다.하지만 항상 그래야합니다. 교착 상태가 발생하지 않도록주의하십시오. HTTP : // 유래 [1] [1] [방법 - 투 - 방지 - 어 - 리눅스 프로그램에서 실행 - 더 -보다 한 번을] : – Guillaume

답변

2

카운트가 1 인 명명 된 세마포어를 사용하십시오. 시작할 때이 세마포어가 사용되는지 확인하십시오. 그렇다면 종료하십시오. 그렇지 않으면 가져 가십시오. 개념 코드의

증명 :이 sem_close 폐쇄 될 때까지 sem_open documentation에서

#include <semaphore.h> 
... 
if (sem_open(<UUID string for my app>, O_CREAT, 600, 1) == SEM_FAILED) { 
    exit(0); 
} 

을 (응용 프로그램 진입 점 근처 어딘가에 넣어)

반환 세마포어 기술자는 호출 프로세스에 사용할 수있다() 또는 호출자가 종료하거나 exec 할 때까지.