Вот в чем проблема: мне не нравятся несколько экземпляров моей программы, поэтому я их отключил. Моя программа открывает определенный тип пантомимы. В моей системе (Ubuntu 12.04), когда я дважды щелкаю один из этих файлов, это выполняется:
/usr/bin/myprogram /path/to/double/clicked/file.myextension
Как я уже сказал, мне не нравятся множественные экземпляры, поэтому, если программа уже запущена и пользователь хочет открыть один из этих файлов, сообщение DBus отправляется в уже экземпляр, чтобы позаботиться об открытом файле. Итак, если есть уже запущенный экземпляр, и пользователь выбирает 3 файла для открытия с помощью моей программы и нажимает кнопку [Enter], система выполняет:
/usr/bin/myprogram /path/to/double/clicked/file1.myextension
/usr/bin/myprogram /path/to/double/clicked/file2.myextension
/usr/bin/myprogram /path/to/double/clicked/file3.myextension
Все эти экземпляры обнаруживают уже запущенный экземпляр и отправляют ему открытый файл. Вообще никаких проблем, пока.
Но что, если уже нет запущенного экземпляра, и пользователь хочет открыть 3 файла вместе с моей программой? Система вызовет одновременно, снова:
/usr/bin/myprogram /path/to/double/clicked/file1.myextension
/usr/bin/myprogram /path/to/double/clicked/file2.myextension
/usr/bin/myprogram /path/to/double/clicked/file3.myextension
и каждый из этих экземпляров поймет, что уже запущен экземпляр, он попытается отправить сообщение DBus в уже запущенный экземпляр и завершит работу. Итак, все 3 процесса будут делать одно и то же, и ничего не запустится.
Как я могу избежать этой проблемы?
PS: Чтобы определить, есть ли уже запущенные экземпляры, я реализую следующий код:
bool already_runs(){
return !system("pidof myprogram | grep \" \" > /dev/null");
}