从另一个进程重新启动一个进程
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 可以解决这个问题? (或者我想不出的某种奇特编码?)
有几种方法可以做到这一点,但有两种选择:
再次启动 ProcessA 时,使用 lpCommandLine
参数(例如 /nolaunch
)向其传递命令行参数。 ProcessA 然后可以在启动时使用 GetCommandLine
获取其命令行,并查看它是否包含 /nolaunch
字符串。
在 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.
我有两个进程: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 可以解决这个问题? (或者我想不出的某种奇特编码?)
有几种方法可以做到这一点,但有两种选择:
再次启动 ProcessA 时,使用
lpCommandLine
参数(例如/nolaunch
)向其传递命令行参数。 ProcessA 然后可以在启动时使用GetCommandLine
获取其命令行,并查看它是否包含/nolaunch
字符串。在 ProcessA 和 ProcessB 中,使用
CreateSemaphore
orCreateMutex
函数创建一个命名的 semaphore/mutex。在 ProcessB 中,这就是您所要做的一切 - 只需确保在进程退出之前不要关闭句柄。在 ProcessA 中,在创建 semaphore/mutex 之后检查是否GetLastError()
returnsERROR_ALREADY_EXISTS
- 这表明 ProcessB 仍然有 semaphore/mutex 打开(因此已经 运行).
您可以通过多种方式解决此问题:
1。持有互斥锁
在 processB 中,您可以持有一个命名的互斥量并将其锁定。当 processB 被创建时,它会尝试锁定互斥锁并失败,然后它会杀死自己。您还可以检查互斥量是否在进程 A 中被锁定,并从一开始就阻止创建进程 B。
2。发送参数以创建进程
CreateProcess 支持通过第二个参数向创建的进程发送命令行参数。您可以将其用作是否应创建 processB 的指标。
3。浏览进程列表
您可以查看当前进程列表并检查 ProcessB 是否已经 运行。可能想调查 Taking a Snapshot and Viewing Processes.