应用场景:A进程在程序中通过createprocess启动了B进程,然后调用B进程执行。
当A进程崩溃时,此时B进程并不知道A进程的状态,导致B进程无法退出。
解决方案:B进程中启动线程不停判断A进程的状态,当判断到A进程不存在时,B进程自动退出。
判断A进程的状态最好的方法就是调用WaitForSingleObject等待A进程的句柄。
问题:B进程怎么得到A进程的句柄呢?
在windows中,句柄是和对象一一对应的32位无符号整数值,所以只需要在启动B进程时
传入A进程的句柄值即可。但是B进程不一定能打开A进程的句柄值,需要处理下。
关键代码:
A进程:DuplicateHandle(GetCurrentProcess(), GetCurrentProcess(),
GetCurrentProcess(), &curProcess, 0,
TRUE, DUPLICATE_SAME_ACCESS) //句柄设置为可继承的
CreateProcess( NULL, (LPSTR)strCmd.c_str(), NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi )
//子进程继承父进程可继承的句柄
B进程:int hand = 0;
sscanf_s(lpCmdLine, "%d", &hand); //从命令行中获取句柄号
parentHandle = (HANDLE) hand;
WaitForSingleObject(parentHandle,timeout)
CloseHandle(parentHandle);
代码段本人测试在win64调用win32进程可行。
当A进程崩溃时,此时B进程并不知道A进程的状态,导致B进程无法退出。
解决方案:B进程中启动线程不停判断A进程的状态,当判断到A进程不存在时,B进程自动退出。
判断A进程的状态最好的方法就是调用WaitForSingleObject等待A进程的句柄。
问题:B进程怎么得到A进程的句柄呢?
在windows中,句柄是和对象一一对应的32位无符号整数值,所以只需要在启动B进程时
传入A进程的句柄值即可。但是B进程不一定能打开A进程的句柄值,需要处理下。
关键代码:
A进程:DuplicateHandle(GetCurrentProcess(), GetCurrentProcess(),
GetCurrentProcess(), &curProcess, 0,
TRUE, DUPLICATE_SAME_ACCESS) //句柄设置为可继承的
CreateProcess( NULL, (LPSTR)strCmd.c_str(), NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi )
//子进程继承父进程可继承的句柄
B进程:int hand = 0;
sscanf_s(lpCmdLine, "%d", &hand); //从命令行中获取句柄号
parentHandle = (HANDLE) hand;
WaitForSingleObject(parentHandle,timeout)
CloseHandle(parentHandle);
代码段本人测试在win64调用win32进程可行。