それが問題です。私は自分のプログラムの複数のインスタンスが好きではないので、それらを無効にしました。私のプログラムは特定の MIME タイプを開きます。私のシステム (Ubuntu 12.04) では、これらのファイルの 1 つをダブルクリックすると、次のように実行されます。
/usr/bin/myprogram /path/to/double/clicked/file.myextension
私が言ったように、私は複数のインスタンスが好きではないので、プログラムがすでに実行されていて、ユーザーがこれらのファイルの 1 つを開くことを選択した場合、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");
}