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

#c #linux

Вопрос:

Мое приложение должно работать в течение длительного времени (обычно на холостом ходу). Если я попытаюсь открыть второе приложение (или запустить приложение с помощью глобальной горячей клавиши) Я бы хотел, чтобы мой существующий экземпляр получил какое-то IPC-сообщение и вышел на передний план. Как мне это сделать в linux? Проблема, с которой я столкнулся, заключается в том, что если я удерживаю глобальную блокировку, она автоматически не освобождается при закрытии экземпляра (обычно я ее разблокирую, но приложение может выйти из строя). Если я попытаюсь использовать mkfifo, я понятия не имею, являюсь ли я первым экземпляром или нет, и каждое решение, которое я могу придумать, похоже, требует большого количества кода, и обычно это для меня признак того, что я, возможно, делаю что-то не так

Ответ №1:

Существует множество примитивов IPC, все они могут быть использованы.

Простой способ-использовать именованный канал: если канал не существует, программа создает его и запускается как обычно. Затем он регулярно опрашивает канал, чтобы узнать, можно ли что-то получить по каналу, и в этом случае программа получает это (и отбрасывает) и выводит себя на «передний план».

С другой стороны, если именованный канал существует, то программа отправляет через него простое фиктивное сообщение и завершает работу.

Ответ №2:

Я бы использовал файл флага, например /run/service-name/pid , с PID первого запущенного экземпляра. Новый экземпляр проверит этот файл, если он не существует, создаст его, если он существует, отправит a SIGUSR1 на PID в файле.

@Ответ какого-то чувака-программиста выше обеспечивает немного большую гибкость.