zoukankan      html  css  js  c++  java
  • 等待进程结束函数中的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

  • 相关阅读:
    Dockerfile
    走进Docker
    liunx 设置定时任务
    《程序员自我修养》读书笔记
    Ubuntu换源
    liunx安装python2.7.12
    预习非数值数据的编码方式
    预习原码补码
    第三章预习
    预习非数值数据的编码方式
  • 原文地址:https://www.cnblogs.com/solohac/p/4630381.html
Copyright © 2011-2022 走看看