Неверные значения из GetProcessHandleCount - PullRequest
2 голосов
/ 24 сентября 2011

Я столкнулся со странным поведением функции GetProcessHandleCount ().Сначала я делаю снимок всех процессов в системе, как описано в msdn:

HANDLE hProcessSnap;
HANDLE hProcess;
PROCESSENTRY32 pe32;
hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
pe32.dwSize = sizeof( PROCESSENTRY32 );
if( !Process32First( hProcessSnap, &pe32 ) )
  {
      CloseHandle( hProcessSnap );
      return 0;
  }

Затем я делаю снимок процессов и подсчитываю открытые дескрипторы, используя функцию GetProcessHandleCount:

 int count_of_handles=0; 
 DWORD dwHandleCount=0; 
 do {
    hProcess = OpenProcess( PROCESS_QUERY_INFORMATION,FALSE,pe32.th32ProcessID);
    GetProcessHandleCount(hProcess,&dwHandleCount); 
    count_of_handles+=dwHandleCount;  
    if( hProcess != NULL ) 
        CloseHandle( hProcess );
  } while( Process32Next( hProcessSnap, &pe32 ) );

Я проверил эту программу в Windows 7 x64.Программа отображала count_of_handles ~ 16000, но на самом деле это значение было ~ 100 000 (если верить диспетчеру задач Windows).
Затем я выполнил эту программу в Windows XP x32 (от VMWare), а count_of_handles было ~ 9000 (но в действительностибыло ~ 8000).
Что не так с моим кодом?Спасибо.

Ответы [ 2 ]

0 голосов
/ 24 сентября 2011

Как и причина Джона , значение из диспетчера задач 1 включает в себя дескрипторы, открытые в ядре - они не будут включены в ваш общий итог по всем процессам.


1 Для такого рода вещей Process Explorer гораздо эффективнее. Включая возможность перечисления открытых дескрипторов для процесса и в ядре , псевдопроцесс system в списке Process Explorer.

0 голосов
/ 24 сентября 2011

С одной стороны, GetProcessHandleCount может вернуть ноль (что означает ошибку). Это может объяснить приход к результату ниже, чем вы ожидаете. Это может быть вызвано ошибкой OpenProcess (вы также не проверяете это).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...