Bir oyun insanların birden fazla örneğini çalıştırmasını nasıl önleyebilir?


15

Starcraft II birden fazla örnek çalıştırmamı yasaklıyor, ancak ikinci örneği Sandboxie'de korumalı olarak çalıştırırsam çalışır. Bunun sebebi ne olabilir?

Bu davranışı kendi oyunlarım için nasıl çoğaltabilirim?

Yanıtlar:


15

Starcraft 2'nin yanı sıra, bunun genel cevabı şudur: İşletim sisteminden belirli bir kaynağı edinme (ve edinmenin kendisi zaten kilitleme ile eşdeğer değilse kilitleme). Çekim / kilitleme başarısız olursa oyundan çıkın. Bu tür kaynaklara örnekler:

  1. Belirli TCP veya UDP bağlantı noktaları.
  2. Karşılıklı özel kilitler ("muteksler") veya semaforlar (bu ikisi genellikle işletim sistemi düzeyinde ilişkilidir)
  3. Dosyalar (günlük dosyaları genellikle en belirgin seçimdir)

En üstte, müşteri yolu için en çok acı çeken, (bazen zorunlu olarak, bazı robotik kontrol bileşenleri için olduğu gibi) sadece tek bir iplik tarafından kullanılabilen özel donanımlar da bu şekilde kullanılabilir.


5
Ayrıca olası güvenlik komplikasyonlarını akılda tutmak yararlı olabilir: " Tek örnekli bir program kendi hizmet reddi. "
EnoughTea

Sandboxie'de çalıştığından, muhtemelen ilk değil. 2 veya 3 iyi olasılıklardır, hangi dosyaların işlemlerine açık olduğuna bakmak muhtemelen onu saptayacaktır.
Doug-W

3
@ Doug-W sandboxie'de nasıl çalıştığını göremiyorum # 1.
AttackingHobo

Sandboxie'nin karmaşıklığını anlamadığım sürece sandboxie'nin dışına bağlanan bir bağlantı noktasının içinde bağlanmasını engellemez mi? Yoksa sandboxie, içinde çalışan her program için sanal bir arayüz sağlıyor mu?
Doug-W

@Vigil Bildiğim kadarıyla, Raymond Chen'i bütün gün teklif edebilirsiniz, ancak lütfen tırnaklarına dilbilgisi hataları eklemeyin. : P (Bunun yerine kopyalayın / yapıştırın.)
hheimbuerger

4

Muteks yaklaşımını tavsiye ederim, ancak:

Sık kullanılan başka bir yöntem, aynı ada sahip başka bir işlemin çalışıp çalışmadığını kontrol etmektir.

Avantajı gülünç derecede kolay olmasıdır - dosya izinleri hakkında endişelenmenize veya muteksin ne olduğunu bilmenize gerek yoktur. Dezavantajı, makinede çağrılan farklı bir program starcraft2.exeçalışıyorsa yanlış pozitif alırsınız .


2
Hehe veya kullanıcı programı yeniden adlandırmaya karar verirse.
Brandon

@Jonathan: O zaman çalıştırılabilir adı
kodlamayın

1
Daha çok, kullanıcı programı kopyalayıp yeniden adlandırır ve iki kez çalıştırırsa?
Brandon

3

C ++ ve Windows API kullanıyorsanız FindWindow, sınıf yolu ve / veya pencere adı gibi parametreleri aktarabileceğiniz yöntemlerden birini kullanmaktır . Bir eşleşme bulursanız, bir pencere yüklemeden veya bir pencere oluşturmadan önce programınızdan çıkmanız yeterlidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.