c++ - 如何同时处理多个并发实例?

标签 c++ linux qt ubuntu multiple-instances

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

最佳答案

我会使用一些共享内存来存储第一个进程的 pid。 QSharedMemory类会在这里帮助你。

您的程序应该做的第一件事是尝试创建一个共享内存段(使用您自己制作的 key )并将您的 pid 存储在其中。如果创建调用失败,那么您可以尝试附加到该段。如果成功,那么您可以从中读取原始进程的 pid。

编辑:另外,记住在写入或读取共享内存之前使用 lock(),然后在完成后调用 unlock()。

关于c++ - 如何同时处理多个并发实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11632637/

相关文章:

c++ - 如何在部分类模板特化中实现继承?

linux - Bash 概念性问题

c++ - 在 C++ 中记录动态数据

java - Linux 服务中未获取环境变量

linux - 通过bash交换两个字符串的位置

c++ - SQLite增量整数主键和唯一约束冲突

c++ - RAII 和 Qt 信号

java - 在QT中重写Java方法draw()

c++ - 如何使用预处理器制作跨平台库?

c++ - 如何使用 boost lambda 在集合中的每个元素上调用方法?