• 等待进程结束函数中的BUG


    偶然发现一个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

  • 相关阅读:
    web应用模式
    Win10升级本地Django版本,以及DRF框架的安装使用
    DRF作业(1)
    中间件作业
    复习day03作业
    python基础复习
    利用自定义中间件来实现DRF框架中的request对象的data属性
    复习Day02(python中魔法方法,cookie/sesison/token,pymysql)
    排序之快排
    排序之归并
  • 原文地址:https://www.cnblogs.com/solohac/p/4630381.html
Copyright © 2020-2023  润新知