There are several methods you can use to accomplish only allowing one instance of your application:
Method 1: Global synchronization object or memory
It’s usually done by creating a named global mutex or event. If it is already created, then you know the program is already running.
For example in windows you could do:
#define APPLICATION_INSTANCE_MUTEX_NAME "{BA49C45E-B29A-4359-A07C-51B65B5571AD}"
//Make sure at most one instance of the tool is running
HANDLE hMutexOneInstance(::CreateMutex( NULL, TRUE, APPLICATION_INSTANCE_MUTEX_NAME));
bool bAlreadyRunning((::GetLastError() == ERROR_ALREADY_EXISTS));
if (hMutexOneInstance == NULL || bAlreadyRunning)
{
if(hMutexOneInstance)
{
::ReleaseMutex(hMutexOneInstance);
::CloseHandle(hMutexOneInstance);
}
throw std::exception("The application is already running");
}
Method 2: Locking a file, second program can’t open the file, so it’s open
You could also exclusively open a file by locking it on application open. If the file is already exclusively opened, and your application cannot receive a file handle, then that means the program is already running. On windows you’d simply not specify sharing flags FILE_SHARE_WRITE
on the file you’re opening with CreateFile
API. On linux you’d use flock
.
Method 3: Search for process name:
You could enumerate the active processes and search for one with your process name.