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

  • 相关阅读:
    【Hadoop】HDFS笔记(一):Hadoop的RPC机制
    英文分句
    破解google翻译API全过程
    最大匹配算法 (Maximum Matching)
    【Html 学习笔记】第八节——表单实践
    【Html 学习笔记】第七节——表单
    【Html 学习笔记】第六节——列表
    Linux下第一次Node尝试
    【Html 学习笔记】第五节——表格
    C++并发低级接口:std::thread和std::promise
  • 原文地址:https://www.cnblogs.com/vc60er/p/3110577.html
Copyright © 2020-2023  润新知