#c #linux
Вопрос:
Мое приложение должно работать в течение длительного времени (обычно на холостом ходу). Если я попытаюсь открыть второе приложение (или запустить приложение с помощью глобальной горячей клавиши) Я бы хотел, чтобы мой существующий экземпляр получил какое-то IPC-сообщение и вышел на передний план. Как мне это сделать в linux? Проблема, с которой я столкнулся, заключается в том, что если я удерживаю глобальную блокировку, она автоматически не освобождается при закрытии экземпляра (обычно я ее разблокирую, но приложение может выйти из строя). Если я попытаюсь использовать mkfifo, я понятия не имею, являюсь ли я первым экземпляром или нет, и каждое решение, которое я могу придумать, похоже, требует большого количества кода, и обычно это для меня признак того, что я, возможно, делаю что-то не так
Ответ №1:
Существует множество примитивов IPC, все они могут быть использованы.
Простой способ-использовать именованный канал: если канал не существует, программа создает его и запускается как обычно. Затем он регулярно опрашивает канал, чтобы узнать, можно ли что-то получить по каналу, и в этом случае программа получает это (и отбрасывает) и выводит себя на «передний план».
С другой стороны, если именованный канал существует, то программа отправляет через него простое фиктивное сообщение и завершает работу.
Ответ №2:
Я бы использовал файл флага, например /run/service-name/pid
, с PID первого запущенного экземпляра. Новый экземпляр проверит этот файл, если он не существует, создаст его, если он существует, отправит a SIGUSR1
на PID в файле.
@Ответ какого-то чувака-программиста выше обеспечивает немного большую гибкость.