Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Общение с дочерним процессом посредством pipe

18K
30 июня 2006 года
bldragon
4 / / 30.06.2006
Кто знает, как можно общаться с дочерним процессом используя pipe (ну или не используя, если можно), если дочерний процесс - не консольное приложение, и перенаправить у него stdin и stdout не получается?
Заранее - большое спасибо.
3
30 июня 2006 года
Green
4.8K / / 20.01.2000
Что значит "перенаправить у него stdin и stdout не получается?"
Код дочернего приложения есть? Тогда можно сделать и stdin, stdout.
Кроме того pipe можно сделать и не на stdin/out
18K
30 июня 2006 года
bldragon
4 / / 30.06.2006
Под "перенаправить у него stdin и stdout не получается?" я имел ввиду следующее:

STARTUPINFO si;
GetStartupInfo(&si);
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdOutput = stdoutWr;
si.hStdInput = stdinRd;

Где stdoutWr, stdinRd - мною созданные pipe-ы. Примерно так я пытаюсь перенаправить stdin и stdout. В общем работает, когда дочерний процесс - приложение консольное. Иначе оно просто закрывается сразу после вызова CreateProcess. А если не на stdin/out, то на чем и как?
350
30 июня 2006 года
cheburator
589 / / 01.06.2006
Можно дать дочернему процессу право наследовать каналы (т.е. пользоваться ими). При создании каналов указываются права наследования - укажи, что наследовать можно. В дочернем процессе вызываешь DuplicateHandle и пользуешься своими каналами.
А если не хочешь использовать каналы - используй отображение файлов на память. См. CreateFileMapping и MapViewOfFile.
Ну и в конце концов, оконные приложения могут обмениваться сообщениями (большие объемы данных так не передашь).
11K
30 июня 2006 года
Ireul
90 / / 15.06.2006
[QUOTE=bldragon]Под "перенаправить у него stdin и stdout не получается?" я имел ввиду следующее:

STARTUPINFO si;
GetStartupInfo(&si);
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdOutput = stdoutWr;
si.hStdInput = stdinRd;

Где stdoutWr, stdinRd - мною созданные pipe-ы. Примерно так я пытаюсь перенаправить stdin и stdout. В общем работает, когда дочерний процесс - приложение консольное. Иначе оно просто закрывается сразу после вызова CreateProcess. А если не на stdin/out, то на чем и как?[/QUOTE]

Чтобы при этом процессы действительно общались по пайпу, не будучи консольными, существует такая функция как GetStdHandle().
Если вызвать WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),...) - то дочерний процесс будет писать в твой пайп.
Как читать на родительской стороне из собственного пайпа ты наверно и сам знаешь :)

Кстати, вызов GetStartupInfo() НЕ ОСВОБОЖДАЕТ ОТ ЗАПОЛНЕНИЯ поля STARTUPINFO::cb - размер структуры должен быть указан всегда - это твоя ошибка. Да и зачем тебе вообще этот GetStartupInfo()?

ЗЫ: И заимей хорошую привычку обнулять структуры через ZeroMemory перед использованием - помогает.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог