Hello,
I have been playing the following program.
I tried on official plan9, 9front, and 9atom.
none of them showed messages that come from:
sysfatal("fork: %r”);
sysfatal("exec: %r");
I suspect that
fork()
does not return -1 even if it failed in creating new process.
Be ware this program may cause system panic.
#include <u.h>
#include <libc.h>
#define ERRLEN 256
static int
waitfor(int pid, char *msg)
{
Waitmsg *w;
while((w = wait()) != nil){
if(w->pid == pid){
strncpy(msg, w->msg, ERRMAX);
free(w);
return 0;
}
free(w);
}
return -1;
}
int
run(char *path, char *cmd)
{
int pid;
int status;
int n;
char *args[32];
char msg[ERRLEN];
n = tokenize(cmd, args, 32);
args[n] = nil;
switch(pid = fork()) {/* assign = */
case -1:
sysfatal("fork: %r");
case 0:
close(0);
exec(path, args);
sysfatal("exec: %r");
default:
break;
}
status = waitfor(pid, msg);
if(status < 0){
werrstr("waitfor: %r");
return -1;
}
return 0;
}
void main(int argc, char *argv[])
{ char *e;
int n;
int m = 100;
char buf[32];
ARGBEGIN{
case 'm': m = atoi(ARGF());
break;
default: sysfatal("usage");
}ARGEND
if(argv[0])
n = atoi(argv[0]);
else
n = 0;
if(n == m)
sysfatal("stop");
print("%d\n",n);
snprint(buf,sizeof(buf),"8.out -m %d %d",m,n + 1);
run("./8.out", buf);
exits(nil);
}