Как сделать процесс осведомленным о других процессах одной и той же программы
Я должен написать программу, которая должна быть осведомлена о другом экземпляре, который сам работает на этой машине, и общаться с ним, а затем умереть. Я хочу знать, есть ли канонический способ сделать это в Linux.
Моя первая мысль заключалась в том, чтобы написать файл, содержащий PID процесса, и искать этот файл каждый раз, когда программа выполняется, но где "правильное" место и имя для этого файла? Есть ли лучший или более "правильный" способ?
Затем я должен сообщить, сказав, что пользователь попытался запустить его, но поскольку есть еще один экземпляр, он передаст задание и выйдет. Я подумал, что просто посылаю сигнал, например SIGUSR1, но это не позволит мне отправлять больше информации, например, дисплей X11, откуда пользователь выполнил второй процесс. Как отправить эту информацию?
Программа связана с Gtk, поэтому решение, использующее glib, в порядке.
Ответы
Ответ 1
Вложение pid в файл является обычным способом достижения этого. Для демонов ( "системные программы" ) общим местом для размещения такого файла является /var/run/PROGRAM.pid
. Для пользовательских программ поместите файл pid в пользовательский homedir (если у программы также есть файлы конфигурации, тогда поместите оба файла конфигурации и файл pid в поддирерр домашнего каталога).
Отправка информации в экземпляр "master" чаще всего осуществляется с использованием сокетов домена Unix, также называемых локальными сокетами. С сокетом вам не понадобится pid файл (если никто не слушает в сокете, процесс знает его мастер).
Ответ 2
Сокеты домена Unix. Создайте первый экземпляр, созданный во временном каталоге, а затем через него общайтесь с другими экземплярами.
Ответ 3
Написание PID файла является общим подходом. Проверьте библиотеку pidfile(3)
.
Ответ 4
Есть ли у linux эквивалент именованного мьютекса или семафора? Итак, вы можете проверить, заблокирован ли он, а затем предупредить пользователя, что у них уже есть, и закрыть его?
это имеет смысл из этой ссылки?
http://www.linuxquestions.org/questions/programming-9/named-mutex-in-linux-296816/
Ответ 5
Есть много способов сделать это. Способ, который вы предложили (используя файл, содержащий PID), является допустимым и используется многими приложениями.
В некоторых случаях файл конфигурации приложения содержит путь к файлу PID, иногда используется жесткий путь. Обычно приложение помещает PID файл в /tmp
, в /var
(если они работают с uid 0) или в их локальном каталоге (~/.application/
).
Не было бы общего предложения о том, где разместить свой PID файл, просто выберите место, которое вы предпочитаете.
Ответ 6
Конечно, вы можете использовать сокет домена Unix; Я думаю, что большинство приложений (которые не используют более высокоуровневую систему, такую как DCOP или DBUS) используют их.
Если вы хотите, чтобы он был специфичным для Linux, вы можете использовать unix-сокет "абстрактное пространство имен"; они довольно приятные, потому что им не нужно существовать в файловой системе.
Если ваша программа ориентирована на пользователя, она, вероятно, должна быть многопользовательской; один пользователь не должен иметь возможность запускать поведение в другой пользовательской копии приложения, а также должна быть обеспечена безопасность, чтобы пользователи не могли легко выполнять DoS друг с другом (пример: если пользователь копирует программу зависает, останавливает ли пользователь B от начала?).