#include <sched.h> | |
#include <signal.h> | |
#include <lib9.h> | |
int fforkstacksize = 16384; | |
int | |
ffork(int flags, void (*fn)(void*), void *arg) | |
{ | |
char *p; | |
int cloneflag, pid; | |
p = malloc(fforkstacksize); | |
if(p == nil) | |
return -1; | |
cloneflag = 0; | |
flags &= ~RFPROC; | |
if(flags&RFMEM){ | |
cloneflag |= CLONE_VM; | |
flags &= ~RFMEM; | |
} | |
if(!(flags&RFFDG)) | |
cloneflag |= CLONE_FILES; | |
else | |
flags &= ~RFFDG; | |
if(!(flags&RFNOWAIT)) | |
cloneflag |= SIGCHLD; | |
else | |
flags &= ~RFNOWAIT; | |
if(flags){ | |
fprint(2, "unknown rfork flags %x\n", flags); | |
return -1; | |
} | |
pid = clone((int(*)(void*))fn, p+fforkstacksize-16, cloneflag, arg); | |
if(pid < 0) | |
free(p); | |
return pid; | |
} | |
int | |
getfforkid(void) | |
{ | |
return getpid(); | |
} | |