How to block running two instances of the same program?

后端 未结 8 1277
暗喜
暗喜 2020-12-01 05:23

I need to make sure that user can run only one instance of my program at a time.
Which means, that I have to check programatically, whether the same program is already r

8条回答
  •  暖寄归人
    2020-12-01 06:07

    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.

提交回复
热议问题