码迷,mamicode.com
首页 > 系统相关 > 详细

等待进程结束函数中的BUG

时间:2015-07-08 16:13:11      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:

偶然发现一个BUG,有一个函数是这样写的:


void WaitProcExit(DWORD dwPid)
{
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, dwPid);
    if ( NULL == hProcess )
    {
        DWORD dwErr = GetLastError();
        Printf("GetLastError=%d.\n", 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.\n", 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

等待进程结束函数中的BUG

标签:

原文地址:http://www.cnblogs.com/solohac/p/4630381.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!