|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|||||||||||
Есть процесс A и дочерний процесс B, который находит хэндл родительского процесса A. И этот хэндл в разных случаях РАЗНЫЙ! Почему?16.07.2011, 20:56. Показов 4126. Ответов 13
Метки нет (Все метки)
Друзья! Вот код A.exe, суть которого просто стать родительским для B.exe и висеть в системе.
Так, а вот код B.exe,
его роль: перебрать все процессы оси. Найти себя-> найти хэндл родительского процесса и вывести его и Найти хэндл процесса A.exe-> вывести его Эти два пунта могут меняться местами в зависимости от того, какой процесс будет найден первым. Но я надеюсь никто не сомневается в том, что выводимые хэндлы должны быть одинаковы в обоих случаях? А зря. Смотрим вывод.
0
|
|||||||||||
| 16.07.2011, 20:56 | |
|
Ответы с готовыми решениями:
13
Передача аргументов из родительского в дочерний процесс Родительский и дочерний процесс: почему запуск начинается сразу с дочернего процесса? Чтение памяти другого процесса по таймеру: нужно ли закрывать хэндл процесса? |
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|
| 16.07.2011, 21:03 [ТС] | |
|
Вот вывод
0
|
|
|
106 / 106 / 11
Регистрация: 17.10.2010
Сообщений: 283
|
|
| 16.07.2011, 22:20 | |
|
Так хэндл и не обязан быть одинаковым.
Каждый процесс имеет свою собственную таблицу хэндлов, и какой хэндл будет ссылаться на тот или иной объект, решает уже система. А вот ID какого-либо процесса является величиной постоянной, какой бы другой процесс его не запрашивал, именно поэтому для получения хэндла чужого процесса используют ID P.S. Грубо говоря, хэндл - это указатель на некий объект в глубине системы. А указатель работает в адресном пространстве только своего процесса. Для другого процесса указатель на ту же область памяти может иметь совсем другое значение, благодаря механизму трансляции адресов. Так что все штатно.
0
|
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|
| 17.07.2011, 01:21 [ТС] | |
|
Нет, нештатно. Я говорю:
вот процесс B получает хэндл процесса A, этот хэндл равен x И опять вот процесс B получает хэндл процесса A, этот хэндл равен y Он получает одну и ту же величину, только по-разному. Один и тот же указатель ё. И этот указатель непостоянен.
0
|
|
|
Заблокирован
|
||
| 17.07.2011, 02:54 | ||
|
typedef void *HANDLE; //всего лишь всевдоним обычного указателя на войд Почему два разных процесса указывают казалось бы на одно и тоже место в памяти, но при этом адреса разные? Начните читать с 22# сообщения по этой ссылке. Указатели
0
|
||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|
| 17.07.2011, 10:10 [ТС] | |
|
Я прочту, конечно, но... Мне кажется, я представляю себе, что такое хэндл.
В процессе есть таблица хэндлов, а у Рихтера она называется таблица описаталей. И там есть разные всякие хэндлы. И очередной хэндл это "индекс в таблице описателей, принадлежащей процессу" И это индексы разны. Вот что странно.
0
|
|
|
106 / 106 / 11
Регистрация: 17.10.2010
Сообщений: 283
|
|
| 17.07.2011, 10:55 | |
|
Сорри, не очень внимательно глянул исходник. Но все равно все штатно.
Один и тот же объект может быть открыт под разными хэндлами даже в одном процессе. Насколько я понимаю внутреннее устройство Windows, обращение к объекту идет следующим образом: хэндл -> объект-описатель -> собственно объект в памяти ядра Так вот, объект в памяти ядра у нас один-единственный, и ему соответствует уникальный ID. А вот объектов-описателей может быть много. Причин для этого вижу две, и обе связаны с обязанностями объекта-описателя: - у разных описателей могут быть разные права доступа к объекту ядра, хотя бы поэтому их может быть несколько - при разрушении описателя, система подсчитывает количество оставшихся описателей, и грохает объект ядра (к процессу, правда, это не относится, т.к. на него, скорее всего, есть еще как минимум одна ссылка внутри самого ядра до окончания работы) P.S. Насколько я помню, DuplicateHandle выдает другой хэндл даже при полном совпадении прав доступа. Скорее всего, OpenProcess реализует похожую стратегию. P.P.S. В своих знаниях по глубинному устройству Windows я не совсем уверен, так что если есть спецы, поправьте меня
0
|
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|||||||
| 17.07.2011, 11:25 [ТС] | |||||||
|
soft.creator, мне это как-то поможет?
Я вызываю хэндл двумя способами (хотя язык не поворачивается называть 2 вызова одной и той же функции с одними и теми же параметрами как 2 способа). Но по крайне ймере в исходнике они разделены. Так вот, второй способ- истиный. Я это определил так:
А у меня стоит задача, чтобы закрыть родительский процесс не исходя из его имени, которое дочерний просто не знает- то есть дочерний процесс должен закрыть родительский, а исходя из его ID (первый способ) А он не работает ........................................ ..................... В ссыли добил пост номер 45 Добавлено через 9 минут
0
|
|||||||
|
106 / 106 / 11
Регистрация: 17.10.2010
Сообщений: 283
|
|
| 17.07.2011, 11:53 | |
|
Очень странно, что TerminateProcess на первом хэндле не сработал.
А что GetLastError говорит?
0
|
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
||||||
| 17.07.2011, 12:23 [ТС] | ||||||
|
Я не умею ей пользоваться, в MSND примеров нет. Вот так на свой страх и риск написал:
Добавлено через 8 минут А в MSND прочёл The system cannot find the file specified. ![]() Это что система не может найти, какой-то файл? Что-то не то.
0
|
||||||
|
106 / 106 / 11
Регистрация: 17.10.2010
Сообщений: 283
|
||||||
| 17.07.2011, 12:31 | ||||||
|
Ошибка 2 - объект не найден. Странная ошибка в этом контексте.
Попробуйте вот что:
0
|
||||||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
||||||
| 17.07.2011, 13:24 [ТС] | ||||||
|
Всё получилось, а вот Ваш код я подогнал под свой, то есть просто не прерываю цикл принудительно. И тоже родительский процесс благополучно уничтожается.
Вопрос остался: почему всё-таки возвращалась ошибка 2?
0
|
||||||
|
106 / 106 / 11
Регистрация: 17.10.2010
Сообщений: 283
|
|
| 17.07.2011, 14:37 | |
|
Я скидывал принудительно ошибку, которую повесит Process32Next, когда больше не осталось процессов, чтобы получить именно ошибку от TerminateProcess. Странно, что у Вас эта ошибка появилась раньше.
1
|
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|
| 17.07.2011, 17:43 [ТС] | |
|
Будем считать вопрос условно-решённым, спасибо большое.
0
|
|
| 17.07.2011, 17:43 | |
|
Помогаю со студенческими работами здесь
14
Хэндл процесса по названию
Родительский и дочерний процесс: процесс не переходит обратно к родителю Найти окно, если известен ID и хэндл процесса
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|