CreateProcess启动进程后,最好CloseHandle(pi.hProcess);CloseHandle(pi.hThread);

通过CreateProcess启动进程,记录pi.dwProcessId; 然后通过OpenProcess判断此进程是否结束。感觉没有什么错误。跑了一下发现,在任务管理器中结束被启动的进程后,OpenProcess照样能获得进程句柄,但在任务管理器中此进程确实不存在了。考虑到进程句柄是一个内核对象。内核对象有引用计数,引用计数为0后才会销毁,OpenProcess会使其引用计数增1。所以就在每次OpenProcess后CloseHandle一下。想着这样应该没有问题了,继续测试发现问题依旧存在。再三思索。觉得CreateProcess得到的pi.hProcess是不是也要关闭一下,马上在CreateProcess后增加CloseHandle(pi.hProcess),继续测试发现问题依旧存在。google一通也没有找到办法,实在没有办法了,抱着试一下的心里在CreateProcess后又增加CloseHandle(pi.hThread)。测试一下,发现问题解决,惊喜万分。

得到一个结论:

  CreateProcess启动进程后,最好CloseHandle(pi.hProcess);CloseHandle(pi.hThread);一下,否则进程结束后其内核对象没有真正销毁。

 

        STARTUPINFO si = {sizeof(si)};
        PROCESS_INFORMATION pi = {0};    
        if (!CreateProcess(NULL, strCmd.GetBuffer(strCmd.GetLength()),
            NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
        {
            g_log.Print(_T("Cannt start process %s"), strCmd);
        }


        CloseHandle(pi.hProcess);
        CloseHandle(pi.hThread);

 

   //--------------------------------

   HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, FALSE, nID);

   CloseHandle(h);

posted @ 2013-05-31 16:09  崇山峻岭  阅读(1638)  评论(0编辑  收藏  举报