Należy upewnić się, że użytkownik może uruchomić tylko jedną instancję mojego programu naraz.
Co oznacza, że muszę sprawdzić programowo, czy ten sam program już działa, i zakończyć w takim przypadku.Jak zablokować uruchamianie dwóch wystąpień tego samego programu?
Pierwszą rzeczą, która przyszła mi do głowy, było stworzenie pliku gdzieś, kiedy program się uruchamia. Następnie każda inna instancja programu sprawdzi, czy plik jest taki i zakończy działanie, jeśli go znalazł.
Problem polega na tym, że program musi zawsze wychodzić z wdziękiem i móc usunąć utworzony przez siebie plik, aby to działało. W przypadku, powiedzmy, przerwy w zasilaniu, plik blokady pozostaje w miejscu i program nie może zostać uruchomiony ponownie.
Aby rozwiązać ten problem, postanowiłem zapisać identyfikator procesu pierwszego programu w pliku blokady, a po uruchomieniu innej instancji sprawdza, czy PID z pliku jest dołączony do niektórych uruchomionych procesów.
Jeśli plik nie istnieje, jest pusty lub PID nie odpowiada żadnemu istniejącemu procesowi, program kontynuuje działanie i zapisuje swój własny PID do pliku.
Wydaje się to działać całkiem dobrze - nawet po nieoczekiwanym zamknięciu szansa, że (teraz przestarzały) identyfikator procesu będzie powiązany z jakimś innym programem, wydaje się być dość niski.
Ale nadal nie czuje się dobrze (istnieje jest szansa na zablokowanie przez jakiś niepowiązany proces) i praca z identyfikatorami procesu wydaje się wykraczać poza standardowe C++ i prawdopodobnie nie jest zbyt przenośna.
Czy istnieje inny (bardziej czysty i bezpieczny) sposób na zrobienie tego? Najlepiej byłoby pracować ze standardem ISO 98 C++ oraz Windows i * nix.
Jeśli nie można tego zrobić niezależnie od platformy, Linux/Unix jest dla mnie priorytetem.
Jeśli dwie osoby skopiować kod mogliby skończyć z tym samym APPLICATION_INSTANCE_MUTEX_NAME: -> –
ya powinni wykorzystywać swój własny, unikalny ciąg :) I nie myślę o zmieniając go z kopalni chociaż jest :) –
istnieje wersja C++ dla Linux C++? (konkretnie C++ 11) Byłoby wspaniale zobaczyć również przykład! –