我有两个进程:ProcessA和ProcessB。
启动应用程序时,我调用使用CreateProcess()
的ProcessA来启动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。
现在,即时通讯卡住了我如何能够实现启动ProcessA的条件,而无需再次启动ProcessB。我最初考虑使用一个标志,但是由于启动ProcessA会将该标志重置为该函数的本地标志,因此将重置该标志。
另外,需要澄清的是:这是在Windows嵌入式紧凑环境中,因此两个进程都作为不同的子项目存在,因此从ProcessB访问ProcessA需要IPC。
我的下一个想法是使用
CreateEvent()
和WaitForSingleObject()
来检查事件是否已发出信号,但是我意识到等待时间必须无限长,这将在我第一次启动应用程序时引起问题。那么,是否有任何类型的Windows(wince)API可以解决此问题? (或者我想不到的某种奇特的编码?)
最佳答案
有几种方法可以执行此操作,但是有两个选择:
lpCommandLine
参数(例如/nolaunch
)将其传递给命令行参数。然后,ProcessA可以在启动时使用 GetCommandLine
获取其命令行,并查看其是否包含/nolaunch
字符串。 CreateSemaphore
或 CreateMutex
函数创建一个命名信号量/互斥量。在ProcessB中,这就是您要做的全部-仅确保在过程退出之前不要关闭手柄。在ProcessA中,在创建信号量/互斥量之后,检查GetLastError()
是否返回ERROR_ALREADY_EXISTS
-这表明ProcessB仍然打开了信号量/互斥量(因此已经在运行)。