Як гра може завадити людям запускати кілька примірників себе?


Відповіді:


15

Окрім Starcraft 2, загальна відповідь на це: Набути (і заблокувати, якщо саме придбання вже не еквівалентно блокуванню) певного ресурсу з операційної системи. Вийдіть із гри, якщо придбання / блокування не вдалося. Прикладом таких ресурсів є:

  1. Конкретні порти TCP або UDP.
  2. Взаємовиключні замки ("мутекси") або семафори (ці два часто пов'язані на рівні ОС)
  3. Файли (файли журналу часто є найбільш очевидним вибором)

У самому верхньому кінці, таким способом може бути також використана спеціальна апаратура, яка (іноді обов'язково, як для деяких робототехнічних компонентів управління) може використовуватися лише однією ниткою.


5
Також може бути корисно пам’ятати про можливі ускладнення безпеки: « Одномоментна програма - це власний відмова в обслуговуванні ».
— ДоситьTea

Оскільки він працює в пісочниці, мабуть, це не перший. 2 або 3 - це хороші можливості, оглянувши, які файли відкриті для їх процесів, ймовірно, це точно визначить.
— Doug-W

3
@ Doug-W Я не бачу, як це працює в пісочниці виключення №1.
— AttackingHobo

@AttackingHobo, якщо я не буду розуміти складність sandboxie, чи не факт, що порт пов'язаний за межами sandboxie, не виключає його зв'язування всередині? Або пісочниця забезпечує віртуальний інтерфейс для кожної програми, що працює всередині неї?
— Doug-W

@Vigil Що стосується мене, ви можете цитувати Реймонда Чена цілий день, але, будь ласка, не додайте граматичних помилок до його цитат. : P (Просто скопіюйте їх / замість них.)
— hheimbuerger

4

Я рекомендую підхід mutex, але:

Інший метод, який часто використовується, - це просто перевірити, чи запущений інший процес з такою ж назвою.

Перевага полягає в тому, що це смішно просто - вам не потрібно турбуватися про дозволи файлів або знати, що таке мютекс. Мінус полягає в тому, що ви отримаєте помилково позитивний результат, якщо на машині працює інша програма, що називається starcraft2.exe.


2
Hehe, або якщо користувач вирішив перейменувати програму.
— Брендон

@Jonathan: Тоді не жорстко
— кодуйте

1
Я мав на увазі більше подібне, що робити, якщо користувач копіює програму та перейменовує її та запускає її двічі?
— Брендон

3

Якщо ви використовуєте C ++ та API Windows, один із способів - це використання FindWindow, де ви можете передавати такі параметри, як ім’я класу та / або ім'я вікна. Тоді якщо ви знайдете відповідність, просто вийдіть із програми, перш ніж ви навіть завантажите або створите вікно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.