zoukankan      html  css  js  c++  java
  • 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);

  • 相关阅读:
    如何解决移动端滚动穿透问题
    如何在mac中通过命令行使用sublime
    正向代理和反向代理
    UTF8、UTF16、UTF16-LE、UTF16-BE、UTF32都是些什么?
    依赖的版本
    如何移除inline-block元素之间的空白
    如何用JavaScript重定向到另一个网页?
    [读书笔记] 高性能网站建设指南
    java使用jconsole查看java程序运行(jmx原理)
    oracle相关知识点
  • 原文地址:https://www.cnblogs.com/vc60er/p/3110577.html
Copyright © 2011-2022 走看看