首页
社区
课程
招聘
[讨论]为什么这个循环使得句柄不断增加?
发表于: 2013-7-29 16:21 6234

[讨论]为什么这个循环使得句柄不断增加?

2013-7-29 16:21
6234
while(true)
{
     hProcess=createProcess(...);
     ::waiteForSigleObject(hProcess,infinite);
     closeHandle(hProcess);
}
任务管理器里看到系统句柄数不断增加,内存使用不断增加

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 38
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
????????发表一下见解啊???乱猜想也好
2013-7-29 16:25
0
雪    币: 952
活跃值: (1826)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
createProcess返的结构里有 hProcess和hThread 都要关闭才可以
2013-7-29 16:25
0
雪    币: 137
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
hProcess
hThread
2013-7-29 16:27
0
雪    币: 38
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
试试。。。。。。
2013-7-29 16:28
0
雪    币: 38
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
CloseHandle掉里面的hTread还是不行啊,句柄还是猛增加?有无什么工具可以看出这些句柄怎么没收掉的?
2013-7-29 16:45
0
雪    币: 1042
活跃值: (500)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
内核对象都需要自己关闭把./
2013-7-29 16:54
0
雪    币: 112
活跃值: (57)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
8
/// @file       prjTestHandle.cpp
/// @brief      测试某人说的CreateProcess句柄泄漏问题

/// build on vs2008

#include "stdafx.h"
#include <Windows.h>
#include <tchar.h>

int _tmain(int argc, _TCHAR* argv[])
{
    BOOL            bRc     =   TRUE;
    const wchar_t * pPeName =   L"c:\\windows\\system32\\notepad.exe";
    wchar_t * pPeNameBuf = new wchar_t[MAX_PATH];

    STARTUPINFO si = { 0 };
    PROCESS_INFORMATION pi = { 0 };

    si.cb = sizeof(si);
    si.dwFlags = STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_SHOWNORMAL;

    while (true)
    {
        _tcscpy_s(pPeNameBuf, MAX_PATH * sizeof(wchar_t), pPeName);

        /// CreateProcess 的返回值是 BOOL, 不是HANDLE...
        bRc = CreateProcess(
            NULL, 
            (LPWSTR)pPeNameBuf, ///< 必须是一个Buffer,不能是一个常量串指针
            NULL, 
            NULL, 
            FALSE, 
            NORMAL_PRIORITY_CLASS, 
            NULL, 
            NULL, 
            &si, 
            &pi);
        
        if (bRc)
        {
            /// 如果要等被测试的notepad.exe执行结束, 就在这等
            // ::WaitForSingleObject(pi.hProcess, INFINITE);

            /// 如果不等带已经建立的notepad.exe结束
            /// 为了防止句柄泄漏, 需要关掉pi的2个句柄
            /// 关掉句柄后, 不影响已经建立的notepad.exe
            ::CloseHandle(pi.hProcess);
            ::CloseHandle(pi.hThread);
        }

        /// 实验结论
        /// 不存在句柄泄漏问题. 说泄漏抓图上来
        /// 拿一个都编译不过的东西上来讨论, 你尊重你自己和回你贴的人么?
    }

	return 0;
}
2013-7-29 20:29
0
雪    币: 1392
活跃值: (5212)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
9
真相在此。。。。。
2013-7-29 20:33
0
雪    币: 112
活跃值: (57)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
10
完善测试程序
/// @file       prjTestHandle.cpp
/// @brief      测试某人说的CreateProcess句柄泄漏问题

/// build on vs2008

#include "stdafx.h"
#include <Windows.h>
#include <tchar.h>

int _tmain(int argc, _TCHAR* argv[])
{
    BOOL            bRc             =   TRUE;
    DWORD           dwProcessCnt    =   0;
    const DWORD     dwProcessCntMax =   0x400; ///< 太多进程, 卡的不行
    const wchar_t * pPeName         =   L"c:\\windows\\system32\\notepad.exe";
    wchar_t pPeNameBuf[MAX_PATH]    =   {0};

    /// 带 CreateProcess的这段程序, Debug版编译后, 在输出目录直接运行报错
    /// 在堆操作那使用了无效的地址, 
    /// 被WinDbg断住后, 看不到此程序中有用的代码位置

    /// 需要编译成Release版运行才正常
    /// 如果需要调试, 编译成Release版带调试符号, 用WinDbg调试吧

    /// 如果直接在Vs2008IDE中单步或全速运行Debug版的程序, 也是正常的
    /// 很奇怪啊

    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    __try
    {
        while (true)
        {
            /// 每建立一个进程, 就休息一下, 防止CPU占用率过高
            ::Sleep(1);

            /// 每次建立进程, 都需要重新设置si和pi ?
            ::ZeroMemory(&si, sizeof(STARTUPINFO));
            ::ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));

            si.cb = sizeof(STARTUPINFO);
            si.dwFlags = STARTF_USESHOWWINDOW;
            si.wShowWindow = SW_SHOWNORMAL;

            _tcscpy_s(pPeNameBuf, MAX_PATH * sizeof(wchar_t), pPeName);

            /// CreateProcess 的返回值是 BOOL, 不是HANDLE...
            bRc = CreateProcess(
                NULL, 
                (LPWSTR)pPeNameBuf, ///< 要使用Buffer, 而不能是常量指针
                NULL, 
                NULL, 
                FALSE, 
                NORMAL_PRIORITY_CLASS, 
                NULL, 
                NULL, 
                &si, 
                &pi);

            if (bRc)
            {
                _tprintf(L"dwProcessCnt = 0x%X\r\n", dwProcessCnt);

                /// 如果要等被测试的notepad.exe执行结束, 就在这等

                /// 确实要等他结束, 这个应用应该是一个守护程序
                /// 防止别人杀掉在自己的程序
                /// 或在自己的程序Crash后,自己重启
                /// 这段代码应该在一个服务中
                ::WaitForSingleObject(pi.hProcess, INFINITE);

                /// 如果不等带已经建立的notepad.exe结束
                /// 为了防止句柄泄漏, 需要关掉pi的2个句柄
                /// 关掉句柄后, 不影响已经建立的notepad.exe
                ::CloseHandle(pi.hProcess);
                ::CloseHandle(pi.hThread);

                if (++dwProcessCnt == dwProcessCntMax)
                {
                    /// 建立的进程够多了, 不搞了
                    break;
                }
            }
            else
            {
                _tprintf(L"error, dwProcessCnt = 0x%X, GetLastError() = 0x%X\r\n", 
                    dwProcessCnt,
                    GetLastError());
                break;
            }
            /// 实验结论:
            /// 不存在句柄泄漏问题
        }
    }
    __finally
    {
        _tprintf(L"catch error, dwProcessCnt = 0x%X, GetLastError() = 0x%X\r\n", 
            dwProcessCnt,
            GetLastError());
    }

__tmain_END:
    _tprintf(L"END, press any key to quit\r\n");
    getwchar();
    return 0;
}
2013-7-29 21:57
0
游客
登录 | 注册 方可回帖
返回
//