这就是问题所在:我不喜欢我的程序的多个实例,这就是我禁用它们的原因。我的程序会打开一个特定的 mime 类型。在我的系统(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");
}