从另一个进程重新启动一个进程

Restarting a process from another process

我有两个进程:ProcessA 和 ProcessB。

当我启动我的应用程序时,我调用使用 CreateProcess() 启动 ProcessB 的 ProcessA。当我的应用程序收到命令 A 时,ProcessA 被 ProcessB 终止。同样,ProcessB 应该在收到命令 B 时重新启动 ProcessA

我卡在重新启动 ProcessA 的过程中。由于 ProcessA 具有重新启动 ProcessB 的代码,我无法阻止它重新启动 ProcessB 的另一个实例。理想情况下,我只想拥有 1 个 ProcessB 实例。

为了从 ProcessA 创建 ProcessB,我有以下代码:

for(int i32Index = 0; i32Index < NUM_PROCESS; i32Index++)
        {
            wcscpy(wcPath,Directorypath.c_str());
            wcscat(wcPath,wcProcess[i32Index]);
            RETAILMSG(1,(_T("Path:%s\r\n"),wcPath));
            bCreateProcessSuccess = CreateProcess(wcPath,   // No module name (use command line)
                                    NULL,                   // Command line
                                    NULL,                   // Process handle not inheritable
                                    NULL,                   // Thread handle not inheritable
                                    FALSE,                  // Set handle inheritance to FALSE
                                    0,                      // No creation flags
                                    NULL,                   // Use parent's environment block
                                    NULL,                   // Use parent's starting directory 
                                    &si,                    // Pointer to STARTUPINFO structure
                                    &pi ) ;                 // Pointer to PROCESS_INFORMATION structure
             if(bCreateProcessSuccess == FALSE)
             {
                 RETAILMSG(1,(_T("Create process failed:%d\r\n"),GetLastError()));
             }
             else
             {
                RETAILMSG(1,(_T("Loading Exes\r\n")));
             }

非常简单的基本代码。我基本上在 ProcessB 中重复了这一点,但它创建了 ProcessA。

现在,我一直在思考如何在不再次启动 ProcessB 的情况下实现启动 ProcessA 的条件。我最初想使用一个标志,但该标志将被重置,因为启动 ProcessA 将重置该标志,因为它是函数的本地标志。

另外,澄清一下:这是在 windows 嵌入式紧凑环境中,因此两个进程都作为不同的子项目存在,因此从 ProcessB 访问 ProcessA 需要 IPC。

我的下一个想法是使用 CreateEvent()WaitForSingleObject() 来检查事件是否发出信号,但我意识到等待时间必须是无限的,这首先会导致问题我启动应用程序的时间。

那么,是否有任何类型的 windows(wince) api 可以解决这个问题? (或者我想不出的某种奇特编码?)

有几种方法可以做到这一点,但有两种选择:

  1. 再次启动 ProcessA 时,使用 lpCommandLine 参数(例如 /nolaunch)向其传递命令行参数。 ProcessA 然后可以在启动时使用 GetCommandLine 获取其命令行,并查看它是否包含 /nolaunch 字符串。

  2. 在 ProcessA 和 ProcessB 中,使用 CreateSemaphore or CreateMutex 函数创建一个命名的 semaphore/mutex。在 ProcessB 中,这就是您所要做的一切 - 只需确保在进程退出之前不要关闭句柄。在 ProcessA 中,在创建 semaphore/mutex 之后检查是否 GetLastError() returns ERROR_ALREADY_EXISTS - 这表明 ProcessB 仍然有 semaphore/mutex 打开(因此已经 运行).

您可以通过多种方式解决此问题:

1。持有互斥锁

在 processB 中,您可以持有一个命名的互斥量并将其锁定。当 processB 被创建时,它会尝试锁定互斥锁并失败,然后它会杀死自己。您还可以检查互斥量是否在进程 A 中被锁定,并从一开始就阻止创建进程 B。

2。发送参数以创建进程

CreateProcess 支持通过第二个参数向创建的进程发送命令行参数。您可以将其用作是否应创建 processB 的指标。

3。浏览进程列表

您可以查看当前进程列表并检查 ProcessB 是否已经 运行。可能想调查 Taking a Snapshot and Viewing Processes.