Мне нужно убедиться, что пользователь может одновременно запускать только один экземпляр моей программы.
Это означает, что я должен проверять программно, работает ли одна и та же программа и выходить в таком случае.
Первое, что мне пришло в голову, это создать файл где-нибудь, когда программа запустится. Затем каждый другой экземпляр программы будет проверять этот файл и выйти, если он его найдет.
Проблема в том, что программа должна всегда изящно выйти и иметь возможность удалить созданный файл, чтобы это работало.
В случае, скажем, отключения питания, файл блокировки остается на месте, и программа не может быть запущена снова.
Чтобы решить эту проблему, я решил сохранить первый идентификатор процесса программы в файле блокировки, и когда запускается другой экземпляр, он проверяет, прикреплен ли PID к файлу некоторому запущенному процессу.
Если файл не существует, он пуст или PID не соответствует существующему процессу, программа продолжает работать и записывает свой собственный PID в файл.
Это работает очень хорошо - даже после неожиданного отключения вероятность того, что идентификатор процесса (теперь устаревший) будет связан с какой-то другой программой, кажется довольно низкой.
Но он все еще не чувствует себя хорошо (есть шанс заблокироваться каким-то несвязанным процессом), и работа с идентификаторами процессов, похоже, выходит за рамки стандартного С++ и, вероятно, также не очень переносима.
Итак, есть ли другой (более чистый и безопасный) способ сделать это? В идеале это будет работать со стандартом ISO 98 С++ и на Windows и * nix. Если это невозможно, независимо от платформы, Linux/Unix является для меня приоритетом.