Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определение конца инициализации дочернего процесса 
V
    Опции темы
Sheff
Дата 24.7.2006, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 503
Регистрация: 25.3.2002
Где: Зеленоград

Репутация: нет
Всего: 3



Такое дело, создаю процесс при помощи CreateProcess. Хотелось бы дождаться его оконачательной инициализации и только потом с ним работать. В MSDN'е сказано юзать WaitForInputIdle, но это не помогает =( У кого какие соображения ?
P.S: Да, можно конечно сделать что-то типа Sleep(100), но это не красиво и не надёжно...

Да, такой же вопрос меня мучает и под линукс, тобишь posix_spawn'ом создаю процесс, а как дождаться полной инициализации ? 


--------------------
--------------------------
Шеф всегда прав :)
PM MAIL WWW ICQ   Вверх
Fixin
Дата 24.7.2006, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 8
Всего: 18



тык, может послать сообщение из дочернего процесса "я готов"? 
PM MAIL ICQ   Вверх
Sheff
Дата 25.7.2006, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 503
Регистрация: 25.3.2002
Где: Зеленоград

Репутация: нет
Всего: 3



Fixin, не, приложение не должно ничего слать, оно не должно даже знать что его запускают как дочернее.

Добавлено @ 08:37 
Fixin, не, приложение не должно ничего слать, оно не должно даже знать что его запускают как дочернее. 


--------------------
--------------------------
Шеф всегда прав :)
PM MAIL WWW ICQ   Вверх
oper54
Дата 25.7.2006, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 217
Регистрация: 13.5.2005

Репутация: нет
Всего: 1



Я в потоках / процесах 0 =(
но вот что мне известно 
dwCreationFlags - вот сюда надо передать флаг CREATE_SUSPENDED
после создания процесс передаст управление вызывающему проц. и замрет,
пока не будит вызвана ResumeThread или ResumProccess или какая там
ф-ия возобновляет работу проц/потока... 
PM MAIL   Вверх
dumb
Дата 25.7.2006, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



приостановка основного потока процесса в случае использования флага CREATE_SUSPENDED происходит после создания процесса системой. а приложению тоже надо инициализироваться(прочитать конфиги, создать окна, итд). так что в данном случае CREATE_SUSPENDED не поможет.

Цитата(Sheff @  24.7.2006,  21:58 Найти цитируемый пост)
В MSDN'е сказано юзать WaitForInputIdle, но это не помогает =(

а это - поможет. если запускаемое приложение не консольное и имеет цикл обработки сообщений. 
PM MAIL   Вверх
Sheff
Дата 25.7.2006, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 503
Регистрация: 25.3.2002
Где: Зеленоград

Репутация: нет
Всего: 3



dumb, а если консольное ? Как у меня. А CREATE_SUSPENDED всё-таки надо будет попробовать 


--------------------
--------------------------
Шеф всегда прав :)
PM MAIL WWW ICQ   Вверх
dumb
Дата 25.7.2006, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



вообще, все зависит от того, что ты хочешь делать в запускаемом приложении. в данном случае проще всего "поспать" секунду-другую. это будет "красивше", чем развешивать хуки и подобной фигней страдать. 
PM MAIL   Вверх
Sheff
Дата 25.7.2006, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 503
Регистрация: 25.3.2002
Где: Зеленоград

Репутация: нет
Всего: 3



dumb, я должет читать/писать в моё дочернее консольное приложение немедленно. Но если так делать, то может так получиться что приложение ещё не инициализировалось, а я уже пишу/читаю 


--------------------
--------------------------
Шеф всегда прав :)
PM MAIL WWW ICQ   Вверх
586
Дата 25.7.2006, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Может, попробовать перехватить точку входа в приложение? 
PM   Вверх
Sheff
Дата 25.7.2006, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 503
Регистрация: 25.3.2002
Где: Зеленоград

Репутация: нет
Всего: 3



586, интересно, а что значит перехватить точку входа в приложение ?, поясни

Добавлено @ 21:10 
Насколько мне известно, точка входа - это адрес, а что значит "перехватить" адрес ? 


--------------------
--------------------------
Шеф всегда прав :)
PM MAIL WWW ICQ   Вверх
586
Дата 25.7.2006, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Цитата(Sheff @  25.7.2006,  22:10 Найти цитируемый пост)
точка входа - это адрес

Это адрес, по которому находится код. Приложение инициализируется и управление передается на этот код. Передаешь управление на свой код, который взаимодействует с родительским процессом. 

Это сообщение отредактировал(а) 586 - 25.7.2006, 21:22
PM   Вверх
Sheff
Дата 25.7.2006, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 503
Регистрация: 25.3.2002
Где: Зеленоград

Репутация: нет
Всего: 3



Ну и как же мне это сделать интересно. Мне что exe'шник пропатчить чтоли ?
Мне нужно лишь дождаться инициализации, причём как я говорил приложение не знает, что оно дочернее. 


--------------------
--------------------------
Шеф всегда прав :)
PM MAIL WWW ICQ   Вверх
586
Дата 26.7.2006, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Запускаешь дочерний процесс функцией CreateProcess, с флагом CREATE_SUSPENDED. Дальше, с помощью функции VirtualAllocEx выделяешь в процессе память и WriteProcessMemory внедряешь туда код.  

Это сообщение отредактировал(а) 586 - 26.7.2006, 00:32
PM   Вверх
dumb
Дата 26.7.2006, 01:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



если под "читать/писать" подразумевается работа с его входным/выходным потоком, то можно просто перенаправить его потоки в пайпы и ждать определенной строки(которую пишет приложение после старта) в пайпе выходного потока. в данном случае, правда, пользователь не сможет напрямую работать с консолью запускаемого приложения.

Цитата(586 @  25.7.2006,  21:03 Найти цитируемый пост)
Может, попробовать перехватить точку входа в приложение?

пардон муа, нет смысла. состояние создаваемого процесса после выхода "родителя" из CreateProcess(...CREATE_SUSPENDED...) ничем не отличается от состояния, в котором оно будет на EP(Entry Point). если и имеет смысл внедрять куда-то код, то тогда уж в функции чтения потока ввода.
повторюсь: многое зависит от конкретного приложения, которое мы запускаем - все эти "танцы с бубном" имеют смысл, если оно имеет довольно длительную и зависящую от различных факторов стадию инициализации. если оно просто грузит много тяжелых библиотек, то достаточно CREATE_SUSPENDED + небольшой Sleep...

ps. гадание на кофейной гуще... впрочем, как обычно. smile 
PM MAIL   Вверх
586
Дата 26.7.2006, 04:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Цитата(dumb @  26.7.2006,  02:35 Найти цитируемый пост)
состояние создаваемого процесса после выхода "родителя" из CreateProcess(...CREATE_SUSPENDED...) ничем не отличается от состояния, в котором оно будет на EP(Entry Point).

Да? А тогда как объяснишь, что Process Explorer не хочет работать с этим процессом?
ИМХО потому что он не инициализирован.
Отладчик его тоже не берет. С приостановленными процессами во время выполнения таких проблем нет. К тому же приостановленный процесс не требует статически подключенных библиотек, что опять же говорит, что процесс не инициализирован.

Цитата(dumb @  25.7.2006,  18:45 Найти цитируемый пост)
в данном случае проще всего "поспать" секунду-другую. это будет "красивше", чем развешивать хуки и подобной фигней страдать. 

 
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0534 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.