Ross Ridge wrote:
> Why isn't there a console window? The Cygwin version of rxvt, and I
> think xterm, creates (and keeps hidden) a console window that should
> be inherited by gcc and as. If there wasn't console window for gcc to
> inherit, why didn't Windows create one for gcc?
I can't answer that. I will, however, attach test test code I've used;
these are tiny programs, nothing to do with GCC. Compiled as:
i686-mingw32-gcc -o child.exe child.c
i686-mingw32-gcc -o parent.exe parent.c
The child just prints a message.
The parent, based on the command line argument its given, invokes the
child in one of several ways; for example "parent spawn" uses spawnv to
invoke the child, while "parent std" uses CreateProcess, with the hStd*
handles filled in and START_USESTDHANDLES.
Here's a table showing what happens:
Cygwin Xterm
============
parent spawn: Pops up DOS window.
parent nostd: No output from child.
parent std: Works.
DOS Console
===========
parent spawn: Works.
parent nostd: No output from child.
parent std: No output from child.
--
Mark Mitchell
CodeSourcery
[EMAIL PROTECTED]
(650) 331-3385 x713
#include <stdio.h>
#include <process.h>
#include <string.h>
#include <windows.h>
int main (int arcgc, char **argv) {
fprintf (stderr, "Parent started\n");
fflush (stderr);
if (strcmp (argv[1], "spawn") == 0) {
const char *const child_argv[2] = { "child.exe", NULL };
spawnvp (_P_WAIT, "child.exe", child_argv);
} else {
PROCESS_INFORMATION pi;
STARTUPINFO si;
si.cb = sizeof (si);
si.lpReserved = NULL;
si.lpDesktop = NULL;
si.cbReserved2 = 0;
si.lpReserved2 = NULL;
if (strcmp (argv[1], "nostd") == 0) {
si.dwFlags = 0;
} else {
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdInput = _get_osfhandle (0);
si.hStdOutput = _get_osfhandle (1);
si.hStdError = _get_osfhandle (2);
}
if (!CreateProcess ("child.exe",
"child.exe",
NULL,
NULL,
/*bInheritHandles=*/TRUE,
/*dwCreationFlags=*/CREATE_NO_WINDOW,
/*lpEnvironment=*/NULL,
/*lpCurrentDirectory=*/NULL,
&si,
&pi)) {
fprintf (stderr, "Could not start child\n");
} else {
WaitForSingleObject(pi.hProcess, INFINITE);
}
}
fprintf (stderr, "Parent done\n");
}
#include <stdio.h>
int main () {
printf ("Child.\n");
return 0;
}