-> PID: 0       Name: Idle

-> PID: 4       Name: System

-> PID: 104     Name: Secure System

-> PID: 176     Name: Registry

-> PID: 908     Name: svchost

-> PID: 920     Name: smss

-> PID: 1016    Name: csrss

-> PID: 1020    Name: NVDisplay.Container

-> PID: 1104    Name: wininit

-> PID: 1112    Name: csrss

************************************

<p id="AutBody_Root522">Исследование конкретного процесса</p>

В дополнение к полному списку всех выполняющихся процессов на заданной машине статический метод Process.GetProcessById() позволяет получать одиночный объект Process по ассоциированному с ним идентификатору PID. В случае запроса несуществующего PID генерируется исключение ArgumentException. Например, чтобы получить объект Process, который представляет процесс с PID, равным 30592, можно написать следующий код:

// Если процесс с PID, равным 30592, не существует,

// то сгенерируется исключение во время выполнения.

static void GetSpecificProcess()

{

  Process theProc = null;

  try

  {

    theProc = Process.GetProcessById(30592);

  }

  catch(ArgumentException ex)

  {

    Console.WriteLine(ex.Message);

  }

}

К настоящему моменту вы уже знаете, как получить список всех процессов, а также специфический процесс на машине посредством поиска по PID. Наряду с выяснением идентификаторов PID и имен процессов класс Process позволяет просматривать набор текущих потоков и библиотек, применяемых внутри заданного процесса. Давайте посмотрим, как это делается.

<p id="AutBody_Root523">Исследование набора потоков процесса</p>

Набор потоков представлен в виде строго типизованной коллекции ProcessThreadCollection, которая содержит определенное количество отдельных объектов ProcessThread. В целях иллюстрации добавьте к текущему приложению приведенный далее вспомогательный статический метод:

static void EnumThreadsForPid(int pID)

{

  Process theProc = null;

  try

  {

    theProc = Process.GetProcessById(pID);

  }

  catch(ArgumentException ex)

  {

    Console.WriteLine(ex.Message);

    return;

  }

  // Вывести статистические сведения по каждому потоку

  // в указанном процессе.

  Console.WriteLine(

    "Here are the threads used by: {0}", theProc.ProcessName);

  ProcessThreadCollection theThreads = theProc.Threads;

  foreach(ProcessThread pt in theThreads)

  {

    string info =

       $"-> Thread ID: {pt.Id}\tStart Time:

       {pt.StartTime.ToShortTimeString()}\tPriority:

       {pt.PriorityLevel}";

    Console.WriteLine(info);

  }

  Console.WriteLine("************************************\n");

}

Как видите, свойство Threads в типе System.Diagnostics.Process обеспечивает доступ к классу ProcessThreadCollection. Здесь для каждого потока внутри указанного клиентом процесса выводится назначенный идентификатор потока, время запуска и уровень приоритета. Обновите операторы верхнего уровня в своей программе, чтобы запрашивать у пользователя идентификатор PID процесса, подлежащего исследованию:

...

// Запросить у пользователя PID и вывести набор активных потоков.

Console.WriteLine("***** Enter PID of process to investigate *****");

Console.Write("PID: ");

string pID = Console.ReadLine();

int theProcID = int.Parse(pID);

EnumThreadsForPid(theProcID);

Console.ReadLine();

После запуска приложения можно вводить PID любого процесса на машине и просматривать имеющиеся внутри него потоки. В следующем выводе показан неполный список потоков, используемых процессом с PID 3804, который (так случилось) обслуживает браузер Edge:

Перейти на страницу:

Похожие книги