Mail Archives: djgpp/2001/02/25/14:38:42
"Michael Allison" <michael DOT allison2 AT sympatico DOT ca> wrote in message
news:CScm6.227001$Pm2 DOT 3684848 AT news20 DOT bellglobal DOT com...
> "Michael Allison" <michael DOT allison2 AT sympatico DOT ca> 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.
If I change execute_by_shell to zero in the code below
I get a "Load error: no DOS memory" after 37 levels of
nesting djgpp programs, which isn't too surprising.
When I set execute_by_shell to 1 I get 35 levels of
nesting with any shell with no error message generated.
/* djgpp toplevel test program for isolating
Windows 2000 problem. parent.c */
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <process.h>
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 > 300) return 0;
(void) itoa(nesting_level, nestval, 10);
printf("\nIn child, nesting level %s (by %s)\n",
nestval,
execute_by_shell ? default_shell : "spawnvpe");
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;
}
- Raw text -