偶然发现一个BUG,有一个函数是这样写的:
void WaitProcExit(DWORD dwPid) { HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, dwPid); if ( NULL == hProcess ) { DWORD dwErr = GetLastError(); Printf("GetLastError=%d. ", dwErr); } WaitForSingleObject(hProcess,INFINITE); //do something after the target process exit //.... return; }
这个函数的功能是等待传入的PID进程退出,然后执行一些业务。
但是在某些环境下执行并非由预期效果。
通过GetLastError得到结果为5,也就是权限问题。
因为dwPid所在的进程为管理员权限,执行WaitProcExit()函数的进程为用户权限,所以OpenProcess失败了。
则改代码应该修改为:
void WaitProcExit(DWORD dwPid) { HANDLE hProcess = OpenProcess(SYNCHRONIZE, 0, dwPid); if ( NULL == hProcess ) { DWORD dwErr = GetLastError(); Printf("GetLastError=%d. ", dwErr); } WaitForSingleObject(hProcess,INFINITE); //do something after the target process exit //.... return; }
应使用SYNCHRONIZE权限OpenProcess。
SYNCHRONIZE 的描述是: The right to use the object for synchronization. This enables a thread to wait until the object is in the signaled state.
具体可以参见:https://msdn.microsoft.com/en-us/library/windows/desktop/ms684880%28v=vs.85%29.aspx