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);

  • 相关阅读:
    centos7 安装 nginx
    centos7 安装 mysql
    centos7 安装 python3.7
    nginx添加到系统命令中
    Java多线程6-线程让步
    Java多线程5-线程等待与唤醒
    Java多线程4-synchronized关键字
    Java多线程3-Thread中start和run方法的区别
    Java多线程-2-常用的实现多线程的两种方式
    java多线程1-基础概念
  • 原文地址:https://www.cnblogs.com/vc60er/p/3110577.html
Copyright © 2011-2022 走看看