![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Lazin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 8 Всего: 154 |
Пишу программу, которая должна получать информацию от разных процессов. Вместе с информацией передается идентификатор процесса, передавшего информацию ( GetCurrentProcessId() ). Моя программа по этим идентификаторам процессы различает, плюс получает информацию о процессе, вот так:
далее я делаю с хэндлом всякое, например это
В общем программа различает все процессы которые к ней обращаются. Проблема в том, что моя программа работает долго, а процессы которые с ней работают могут пере запускаться многократно, и в один прекрасный момент вновь запушеный процесс может иметь такой-же идентификатор как и процесс убитый неделю назад, и в этом случае логика работы нарушается. В общем я решил, отслеживать не только id процесса, но и время его запуска. Такой набор данных будет уникален для всех когда либо запущенных процессов ОС. Либо еще один вариант, можно(?) как то определить момент завершения процесса(не только нормального, но и аварийного), и ... удалить невалидный идентификатор из списка. |
||||
|
|||||
| ama_kid |
|
|||
![]() АСУТП-кодер ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1460 Регистрация: 5.3.2007 Где: Москва Репутация: 5 Всего: 95 |
Как вариант - можно периодически делать "снимок" процессов функцией EnumProcesses и если процесса из твоего списка нету в снимке - тогда он не валиден...
-------------------- самурай без меча подобен самураю с мечом, но только без меча |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 8 Всего: 154 |
То-же вариант. Открыл для себя функцию GetProcessTimes. P.S. Еше один вопрос, что возвратит функция WaitForSingleObject(hProcess, INFINITE) при завершении процесса hProcess. Добавлено через 2 минуты и 9 секунд WAIT_OBJECT_0, WAIT_TIMEOUT или WAIT_ABANDONED? |
|||
|
||||
| SergeCpp |
|
||||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 955 Регистрация: 8.8.2005 Где: At Home Репутация: 10 Всего: 124 |
Чтобы не было вот такого вот
Нужно передавать handle (GetCurrentProcess() => DuplicateHandle()) Полученный handle будет действителен. Если при очередной проверке окажется, что процесс уже не работает, handle можно и закрыть если он не нужен дальше. Можно и удерживать. |
||||
|
|||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 8 Всего: 154 |
SergeCpp, а что делать если процессы разные - часть 32х битные, а часть 64х, у них HANDLE будет разной длины. А вообще спасибо, интересный вариант.
|
|||
|
||||
| SergeCpp |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 955 Регистрация: 8.8.2005 Где: At Home Репутация: 10 Всего: 124 |
С handle что-нибудь сами придумайте, это уже микроскопические детали
Использование Process ID в Вашей задаче чем-то сродни неиспользованию межпроцессной синхронизации при доступе к разделяемому ресурсу Используя же handle, Вы придерживаете объект ядра процесс, он не будет удалён (сам процесс может быть и завершён) |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 8 Всего: 154 |
еще один вопрос, я пытаюсь проверить существует ли процесс с определенным идентификатором с помощью OpenProcess, msdn говорит что OpenProcess возвращает NULL, если процесс с таким идентификатором не существует, но на практике выясняется, что OpenProcess для недавно закрытого процесса (через TerminateProcess) возвращает хэндл(не NULL и не INVALID_HANDLE_VALUE), по которому можно получить информацию о процессе!!! В это время процесса с таким идентификатором в системе нет и в помине. Как можно еще проверить есть ли процесс с заданным идентификатором, не делая snapshot всех процессов.
|
|||
|
||||
| asd |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 89 Регистрация: 25.6.2006 Репутация: 1 Всего: 1 |
Lazin,
Чтобы узнать завершился ли процес Нужно вызвать ф-ию GetExitCodeProcess. Если процесс работает, то ф-ия вернёт STILL_ACTIVE, если нет, то статус завершения. Чтобы поймать момент завершения процесса, нужно Перезать в ф-ию WaitForSingleObject хендл процесса, и ожидание закончится, когда процесс завершится. Вобщем в MSDN-е прочитай про эти ф-ии. |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 8 Всего: 154 |
Вообще изначально у меня есть id процесса, по нему я получаю хэндл, так-вот, для завершенного процесса(через terminate) в течении длительного времени возвращается нормальный хэндл, мне очень интересно почему. Wait функции, то-же ведут себя так как будто процесс не завершен, хотя процесса с таким id в данный момент времени несуществует. В списке возвращаемом EnumProcesses его то-же нету. |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 8 Всего: 154 |
GetExitCodeProcess работает так как нужно, всем спс
правда я так и непонял почему процесс можно открыть функцией OpenProcess после его (процесса) завершения |
|||
|
||||
| SergeCpp |
|
||||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 955 Регистрация: 8.8.2005 Где: At Home Репутация: 10 Всего: 124 |
Я уже писал про это
Дело в том, что объект ядра процесс удерживается системой до тех пор, пока есть хотя бы один открытый handle этого процесса Выполнение процесса — это ведь условность, это же выполнение потока в процессе Существование объекта ядра "процесс" не зависит от выполнения объекта ядра "поток" в этом процессе Проверьте Ваши программы — все ли handle процессов закрываются (когда они уже не нужны) Это сообщение отредактировал(а) SergeCpp - 15.11.2007, 10:15 |
||||
|
|||||
| Lazin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 8 Всего: 154 |
в том то и дело, что закрываются, это очень легко проверить: во первых по коду их использование ограничено одним классом, handle-ы создаются и сразу уничтожаются, и никогда не хранятся, во вторых, когда я открываю процессы с разными id
hProc - всегда имеет одно и то-же значение, если бы я не закрыл хэндл где-нибудь, то значения хэндлов для разных процессов отличались-бы. |
||||
|
|||||
| alias_trinity |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 10.5.2007 Репутация: 1 Всего: 1 |
Для получения информации про процесс юзай Натив АПИ. NtQuerySystemInformation(). Полезная штука.
Можеш написать полноценный диспетчер задач. Хотя в режиме юзера тоже можно заменить кучкой ф-ций. GetProcessMemoryInfo(), GetProcessHandleCount(), GetProcessTimes()... |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |