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; }