Мне нужно убедиться, что пользователь может запускать только один экземпляр моей программы за раз.
Это означает, что я должен проверить программно, работает ли одна и та же программа и выходить в таком случае.Как заблокировать запуск двух экземпляров одной и той же программы?
Первое, что мне пришло в голову, это создать файл где-нибудь, когда программа запустится. Затем каждый другой экземпляр программы будет проверять этот файл и выйти, если он его обнаружит.
Проблема в том, что программа должна всегда изящно выйти и иметь возможность удалять созданный ею файл, чтобы это работало. В случае, скажем, отключения электроэнергии, файл блокировки остается на месте, и программа не может быть запущена снова.
Чтобы решить эту проблему, я решил записать идентификатор процесса первой программы в файл блокировки, а когда запускается другой экземпляр, он проверяет, подключен ли PID из файла к некоторому запущенному процессу.
Если файл не существует, он пуст или PID не соответствует существующему процессу, программа продолжает работать и записывает свой собственный идентификатор PID в файл.
Это, кажется, работает очень хорошо - даже после неожиданного отключения вероятность того, что (теперь устаревший) ID процесса будет связана с какой-либо другой программой, кажется довольно низкой.
Но он по-прежнему не чувствует себя хорошо (там есть шанс заблокироваться каким-то несвязанным процессом), и работа с идентификаторами процессов, похоже, выходит за рамки стандартного C++ и, вероятно, также не очень переносима.
Итак, есть ли другой (более чистый и безопасный) способ сделать это? В идеале это будет работать со стандартом ISO 98 C++ и Windows и * nix.
Если это невозможно, независимо от платформы, Linux/Unix является для меня приоритетом.
Если два человека скопировать код, который они могли бы в конечном итоге с тем же APPLICATION_INSTANCE_MUTEX_NAME: -> – 2008-10-05 04:05:50
Я. они должны использовать свою собственную уникальную строку :) Я думаю, что изменить его из шахты, хотя :) – 2008-10-05 05:06:06
является существует ли Linux C++ вариант метода 1? (в частности, C++ 11) Было бы замечательно видеть пример! – 2016-04-11 20:20:12