Разрешить только один запущенный экземпляр программы

Как я могу ограничить мою программу для запуска только экземпляра? В настоящее время я запускаю свою программу как демон (запускается и останавливается автоматически), и когда пользователь щелкает и пытается запустить снова (что не является допустимым вариантом использования), процесс запускается в контексте пользователя, и я хотел бы избежать этого по многим причинам,

Как я могу достичь этого?

На данный момент я получаю список процессов и делаю некоторые проверки и завершаю работу в самом начале, но этот метод не является чистым, хотя он решает мою проблему.

может кто-нибудь дать мне лучшее решение? И я использую PS, чтобы получить список процессов, есть ли надежный API для этого?

1 ответ

Решение

Используйте именованный семафор со счетчиком 1. При запуске проверьте, не занят ли этот семафор. Если это так, выходите. Иначе возьми.

Доказательство концептуального кода: (положить где-то рядом с точкой входа приложения)

#include <semaphore.h>
...
if (sem_open(<UUID string for my app>, O_CREAT, 600, 1) == SEM_FAILED) {
  exit(0);
}

Из документации по sem_open,

Возвращенный дескриптор семафора доступен вызывающему процессу до тех пор, пока он не будет закрыт с помощью sem_close(), или до тех пор, пока вызывающая программа не выйдет или не выполнит.

Другие вопросы по тегам