Гена_С Гость
|
Добавлено: Сб Май 08 2004 13:10 Заголовок сообщения: прпадает stdout в дочернем процессе под XP. |
|
|
есть 2 программы. Одна запускает другую. Обе выводят на консоль (я прробовал и stderr и stdout).
Под win98 -все нормально. Под XP дочерний процесс ничего на консоль не выводит. ПРи этом запускаеться и работает - я пробовал писать в файл - все пишет ок.
да - я проверял №№ каналов stdout и stderr в родителе и дочке - одинаковые.
Подскажите - что я сделал не так. мне нужно видеть вывод обоих процессов
вот коды. родитель.
Код: |
// parent.cpp
#include <iostream>
#include <stdlib.h>
#include <windows.h>
#include <process.h>
using std::cerr;
int main (){
char cmdline[]="child_proc.exe";
HANDLE handle_stdout=GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE handle_stderr=GetStdHandle(STD_ERROR_HANDLE);
cerr<<" ** calling child process, cmdline="<<cmdline<<"\n";
cerr<<" stdout="<<(int)handle_stdout<<" stderr="<<(int)handle_stderr<<"\n";
DWORD exitCode;
STARTUPINFO s_info={sizeof(STARTUPINFO),NULL,NULL,NULL,0,0,0,0,0,0,0,
/* STARTF_USESTDHANDLES */ 0,SW_SHOWMINNOACTIVE, 0,NULL,
0,0,0};
PROCESS_INFORMATION p_info;
BOOL pCreate=CreateProcess(NULL,cmdline,NULL,NULL,FALSE/*TRUE*/,
CREATE_NO_WINDOW,NULL,NULL,&s_info, &p_info);
WaitForSingleObject(p_info.hProcess,60000);
cerr<<" ** returned from child process: \n";
return 1;
}
|
вот дочка
Код: |
#include <fstream>
#include <iostream>
#include <windows.h>
main (){
std::cout<<" child: cout\n";
std::cerr<<" child: cerr\n";
printf(" child: printf\n");
std::flush(std::cout);
std::ofstream ou("test");
ou<<"child ok\n";
HANDLE handle_stdout=GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE handle_stderr=GetStdHandle(STD_ERROR_HANDLE);
ou<<" stdout="<<(int)handle_stdout<<" stderr="<<(int)handle_stderr<<"\n";
std::cerr<<" stdout="<<(int)handle_stdout<<" stderr="<<(int)handle_stderr<<"\n";
ou.close();
return 1;
}
|
вот что я имею на win98 и на winXP
Код: |
-- Win98 console -------------------------------------------------------
C:\home\work1\stdio>parent.exe
** calling child process, cmdline=child_proc.exe
stdout=12 stderr=16
child: cout
child: cerr
child: printf
stdout=12 stderr=16
** returned from child process:
-- WinXP console -------------------------------------------------------
C:\home\work1\stdio>parent.exe
** calling child process, cmdline=child_proc.exe
stdout=7 stderr=11
** returned from child process:
-------------------------------------------------------------------------
|
Спасибо. Гена |
|
wildwind
Зарегистрирован: 03.02.2004 Сообщения: 268 Откуда: Москва
|
Добавлено: Пн Май 10 2004 02:33 Заголовок сообщения: |
|
|
Твой код выглядит так, как будто ты его накопировал из книжки или еще откуда, не вникая в смысл. А доку по STARTUPINFO прочитать было слабо?
То что у тебя закомментарено, /* STARTF_USESTDHANDLES */, это и есть как раз то, что тебе надо. Этот флаг говорит CreateProcess, что хочу мол подменить stderr и stdout. А в последних двух полях нужно передать соответствующие хэндлы, то есть handle_stdout и handle_stderr в твоем случае.
И конечно в CreateProcess параметр bInheritHandles должен быть TRUE, а не FALSE. |
|