From: "Michael Allison" Newsgroups: comp.os.msdos.djgpp References: Subject: Re: Eradicating djgpp W2000 problem Lines: 79 X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 5.50.4133.2400 X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4133.2400 Message-ID: Date: Sun, 25 Feb 2001 19:16:50 GMT NNTP-Posting-Host: 216.209.119.164 X-Trace: news20.bellglobal.com 983128610 216.209.119.164 (Sun, 25 Feb 2001 14:16:50 EST) NNTP-Posting-Date: Sun, 25 Feb 2001 14:16:50 EST Organization: Sympatico To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com "Michael Allison" wrote in message news:wkbm6.226404$Pm2 DOT 3670275 AT news20 DOT bellglobal DOT com... > > Let's constructively try to come up with the absolute minimum set > of two programs that can cause the problem to occur, as a start > to understanding it. There is obviously more to reproducing this problem than nesting djgpp programs as people claim. The code below went to 6 levels of nesting fine on Windows 2000 professional. So where do we go from here? /* djgpp toplevel test program for isolating Windows 2000 problem */ #include #include #include #include char *default_shell = "command.com"; static int execute_by_shell; int dos_status; int proc_return; int nesting_level = 0; #define CMDBUFSIZ 200 char *parentenv[] = { "PARENT1=environment will be", "PARENT2=passed to child process", (char *)0 }; char nestval[CMDBUFSIZ]; char *args[] = { "parent.exe", nestval, (char *)0 }; int main(int argc, char *argv[]) { char mycmdline[CMDBUFSIZ]; execute_by_shell = 0; if (argc > 1) nesting_level = atoi(argv[1]); nesting_level++; if (nesting_level > 6) return 0; (void) itoa(nesting_level, nestval, 10); printf("\nIn child, nesting level %s\n", nestval); if (execute_by_shell) { char *cmdline = mycmdline; (void) strncpy(mycmdline, argv[0], CMDBUFSIZ - (sizeof(nesting_level) + 1)); (void) strcat(mycmdline, " "); (void) strcat(mycmdline, nestval); proc_return = system (cmdline); } else { proc_return = spawnvpe (P_WAIT, args[0], args, parentenv); } /* If the child got a signal, dos_status has its high 8 bits set, so be careful not to alter them. */ if (proc_return == -1) dos_status |= 0xff; else dos_status |= (proc_return & 0xff); return dos_status; }