我有两个流程:ProcessA和ProcessB。
当我启动我的应用程序时,我调用ProcessA,它使用CreateProcess()
启动ProcessB。当我的应用程序收到命令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可以解决这个问题? (或者某种我想不到的奇特编码?)
答案 0 :(得分:6)
有几种方法可以做到这一点,但有两种选择:
再次启动ProcessA时,使用lpCommandLine
参数(例如/nolaunch
)将命令行参数传递给它。然后,ProcessA可以在启动时使用GetCommandLine
获取其命令行,并查看它是否包含/nolaunch
字符串。
在ProcessA和ProcessB中,使用CreateSemaphore
或CreateMutex
函数创建命名信号量/互斥量。在ProcessB中,您只需要做 - 只需确保在进程退出之前不关闭句柄。在ProcessA中,创建信号量/互斥锁后检查GetLastError()
是否返回ERROR_ALREADY_EXISTS
- 这表示ProcessB仍然打开信号量/互斥量(因此已经在运行)。
答案 1 :(得分:2)
有多种方法可以证明这一点:
在processB中,您可以保存一个已命名的互斥锁并将其锁定。当将创建processB时,它将尝试锁定互斥锁并失败,并且它将自行终止。您还可以检查互斥锁是否在processA中被锁定,并阻止从头开始创建processB。
CreateProcess支持通过第二个参数向创建的进程发送命令行参数。您可以将其用作是否应创建processB的指示器。
您可以浏览当前进程列表并检查ProcessB是否已在运行。可能想看看Taking a Snapshot and Viewing Processes。