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

C++ 检查进程和通信的已运行副本,c++,c,C++,C,好的,我有一些检查流程实例是否已经运行的想法,但我想先了解其他人已经做了什么/使用了什么。我想做一些类似firefox的事情,有时候它会说firefox已经在运行了等等等等,它只会检查是否有另一个副本在运行,我并不是真的想检查是否有一个任意命名的进程在运行,只是如果有另一个副本在运行 我不知道仅仅设置一个系统来查找任意进程并只查找自身是否更容易,或者实现一个系统来查找该进程是否更好 我正试图最终导致能够与另一个进程通信,以便向它发送消息 例如,假设您已经运行了firefox,然后执行firefo

好的,我有一些检查流程实例是否已经运行的想法,但我想先了解其他人已经做了什么/使用了什么。我想做一些类似firefox的事情,有时候它会说firefox已经在运行了等等等等,它只会检查是否有另一个副本在运行,我并不是真的想检查是否有一个任意命名的进程在运行,只是如果有另一个副本在运行

我不知道仅仅设置一个系统来查找任意进程并只查找自身是否更容易,或者实现一个系统来查找该进程是否更好

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

例如,假设您已经运行了firefox,然后执行
firefox URLHERE
命令,它会在打开的原始窗口中打开新的url

我也在试图找出如何实现这一点,因此,如果你对最好的方法有任何想法,那么请务必让我知道


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

调查或调查

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


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

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

调查或调查

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


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

这是高度特定于平台的。请添加O/S标记。这是高度特定于平台的。请添加一个O/S标记。您是否有任何信息,说明您通常如何防止或至少解决rouge程序创建互斥锁或具有您将要使用的名称的管道的问题,是否有任何信息来检查创建命名管道的进程是什么?否?@legion-再次假设windows,是,您可以查询并找出哪个进程拥有任何内核对象(包括互斥体/命名管道)。然而,就防范流氓进程而言,我只能看到一些选项使其变得更难:1。创建一个服务,作为其他流程的协调器/管理器。此服务可以创建命名管道,然后另一个进程将连接到该管道并请求访问。2.提出一种算法,可以生成管道的名称,这会使其他应用程序更难猜出管道的名称。您是否知道如何防止或至少解决rouge程序使用您将要使用的名称创建互斥锁或管道的问题,是否仍要检查创建命名管道的进程是什么?否?@legion-再次假设windows是,您可以查询并找出哪个进程拥有任何内核对象(包括互斥/命名管道)。然而,就防范流氓进程而言,我只能看到一些选项使其变得更难:1。创建一个服务,作为其他流程的协调器/管理器。此服务可以创建命名管道,然后另一个进程将连接到该管道并请求访问。2.想出一个算法,可以生成管道的名称,这将使其他应用程序更难猜出管道的名称。