Как сделать процесс осведомленным о других процессах одной и той же программы

Я должен написать программу, которая должна быть осведомлена о другом экземпляре, который сам работает на этой машине, и общаться с ним, а затем умереть. Я хочу знать, есть ли канонический способ сделать это в 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 от начала?).