Данная задача была предложена в виде вступительного испытания на Межфакультетскую кафедру теоретической и прикладной информатики МФТИ.
Напишите простое приложение-singleton echoloop
. Само приложение выводит раз в секунду переданные ему параметры.
> echoloop "test text"
test text
test text
test text
...
При попытке повторного запуска новое приложение должно обнаружить, что экземпляр уже запущен, отправить свои параметры в ранее запущенное приложение и завершиться, сообщив об этом. Запущенное приложение после этого должно печатать и свои, и полученные параметры.
> echoloop "test1" &
test1
test1
> echoloop "test2"
echoloop for "test2" finished!
test1
test2
test1
test2
...
Данная программа была написана на языке программирования Golang. Для поддержки Golang терминалом следует скачать бинарные файлы по ссылке: https://golang.org/dl/
Изначально был создан mutex
файл, который проверяет уникальность процесса.
Используя функцию FcntlFlock
, устанавливаем блокировку на запись для mutex
файла. Если исполняемый файл был запущен не первым, то его аргументы передаются в fifo
файл, сам он завершается.
Далее создается и открывается глобальный fifo
файл.
Приложение отлавливает сигналы os.Kill
и os.Interrupt
. В случае получения сигнала приложение закрывает и удаляет все ненужные файлы, и завершает работу.
Печать аргументов происходит в отдельной goroutine
, связь с которой обеспечивается с помощью канала.
Основная goroutine
находится в ожидании поступления аргументов из глобального fifo
файла.