检查已经运行的进程和通信副本

时间:2012-01-15 19:14:56

标签: c++ c

好的,我有一些想法,可以检查一个进程的实例是否已经在运行,但我想知道其他人已经/先使用了什么。我正在寻找像firefox那样的东西,有时它说火狐已经在运行等等等等,它只检查是否有另一个自身运行的副本,我真的不想检查是否只是一个任意命名的进程,如果有另一个自身副本就会运行。

我不知道是否更容易设置一个系统来寻找任意流程,只是寻找自己,或者是否更好地实现一个系统来寻找那个流程。 / p>

我试图最终导致能够与另一个进程通信,以便我可以向其发送消息。

所以说这样做只是作为一个例子:假设你已经运行了firefox然后你执行了firefox URLHERE的命令它打开了原始窗口中打开的新url。

我也想弄清楚如何实现这一点,所以如果您对最佳方法有任何想法,那么请务必告诉我。

由于

1 个答案:

答案 0 :(得分:4)

假设Windows - 其他操作系统可能提供类似的结构,但实现细节会有所不同

查看named pipesnamed mutexes

命名的互斥解决方案将更容易编码,但它不会为您提供进程间通信。理论是这样的:你的过程试图创建一个命名的互斥体。如果失败则意味着该进程的另一个副本已在运行。这是由操作系统保证的 - 只能使用特定名称创建一个名为mutex的互斥锁。诀窍在于为您的互斥锁选择合适的名称,这样您就不会冒险与另一个想要创建/使用相同名称的互斥锁的程序发生意外冲突。为此,您可以使用GUID。 但请注意,恶意应用程序可能会创建您正在寻找的命名互斥锁,并阻止您的应用程序运行

第二个选项是使用命名管道(关于选择名称的相同故事)。您的进程将尝试在启动时创建具有特定名称的管道。如果由于管道已经存在而创建管道失败,它将继续并尝试连接到管道,然后您可以让第二个进程与第一个进程交换信息(即传递其参数,以便原始进程可以执行操作)