W jaki sposób gra może uniemożliwić uruchamianie wielu wystąpień?

15

Starcraft II ogranicza mnie do uruchamiania wielu instancji, ale jeśli uruchomię drugą instancję w piaskownicy w Sandboxie , to zadziała . Co może to tłumaczyć?

Jak mogę powtórzyć to zachowanie dla własnych gier?

Brandon
źródło

Odpowiedzi:

15

Oprócz Starcraft 2 ogólna odpowiedź na to pytanie: Zdobądź (i zablokuj, jeśli samo nabycie nie jest już równoważne zablokowaniu) określonego zasobu z systemu operacyjnego. Wyjdź z gry, jeśli akwizycja / blokowanie się nie powiedzie. Przykładami takich zasobów są:

  1. Określone porty TCP lub UDP.
  2. Blokady wzajemnie się wykluczające („muteksy”) lub semafory (te dwa są często powiązane na poziomie systemu operacyjnego)
  3. Pliki (pliki dziennika są często najbardziej oczywistym wyborem)

Na najwyższym poziomie, najbardziej uciążliwym dla klienta, specjalistyczny sprzęt, który (czasami koniecznie, jak w przypadku niektórych robotycznych elementów sterowania) może być używany tylko przez jeden wątek, może być również używany w ten sposób.

Martin Sojka
źródło
5
Warto również pamiętać o możliwych komplikacjach związanych z bezpieczeństwem: „ Program z pojedynczą instancją to własna odmowa usługi ”.
EnoughTea
Ponieważ działa w piaskownicy, prawdopodobnie nie jest to pierwszy. 2 lub 3 to dobre możliwości, przypuszczenie, które pliki są otwarte na ich procesy, prawdopodobnie je wskaże.
Doug-W
3
@ Doug-W Nie rozumiem, jak to działa w piaskownicy wyklucza numer 1.
AttackingHobo
@AttackingHobo, chyba że tęsknię za zrozumieniem złożoności piaskownicy, czyż fakt, że port nie jest związany z piaskownicą, nie wyklucza wiązania się w nim? Czy też sandboxie zapewnia wirtualny interfejs dla każdego programu w nim uruchomionego?
Doug-W
@Vigil Moim zdaniem możesz cytować Raymonda Chena przez cały dzień, ale proszę nie dodawać błędów gramatycznych do jego cytatów. : P (Po prostu skopiuj / wklej je zamiast tego)
hheimbuerger
4

Polecam podejście mutex, ale:

Inną często używaną metodą jest po prostu sprawdzenie, czy działa inny proces o tej samej nazwie.

Zaletą jest to, że jest to absurdalnie łatwe - nie musisz martwić się o uprawnienia do plików ani wiedzieć, czym jest muteks. Minusem jest to, że otrzymasz fałszywie dodatni, jeśli na komputerze działa inny program o nazwie starcraft2.exe.

BlueRaja - Danny Pflughoeft
źródło
2
Hehe lub jeśli użytkownik zdecyduje się zmienić nazwę programu.
Brandon,
@Jathanathan: Więc nie koduj sztywno nazwy pliku wykonywalnego ...
BlueRaja - Danny Pflughoeft
1
Miałem na myśli bardziej, co jeśli użytkownik skopiuje program i zmieni jego nazwę i uruchomi go dwukrotnie?
Brandon
3

Jeśli używasz C ++ i Windows API, jednym ze sposobów jest użycie FindWindow, w którym możesz przekazać parametry takie jak nazwa klasy i / lub nazwa okna. Następnie, jeśli znajdziesz dopasowanie, po prostu zamknij program, zanim jeszcze załadujesz lub utworzysz okno.

SourceTurtle
źródło