Blob
1 #include <sched.h>2 #include <signal.h>3 #include <lib9.h>5 int fforkstacksize = 16384;7 int8 ffork(int flags, void (*fn)(void*), void *arg)9 {10 char *p;11 int cloneflag, pid;13 p = malloc(fforkstacksize);14 if(p == nil)15 return -1;16 cloneflag = 0;17 flags &= ~RFPROC;18 if(flags&RFMEM){19 cloneflag |= CLONE_VM;20 flags &= ~RFMEM;21 }22 if(!(flags&RFFDG))23 cloneflag |= CLONE_FILES;24 else25 flags &= ~RFFDG;26 if(!(flags&RFNOWAIT))27 cloneflag |= SIGCHLD;28 else29 flags &= ~RFNOWAIT;30 if(flags){31 fprint(2, "unknown rfork flags %x\n", flags);32 return -1;33 }34 pid = clone((int(*)(void*))fn, p+fforkstacksize-16, cloneflag, arg);35 if(pid < 0)36 free(p);37 return pid;38 }40 int41 getfforkid(void)42 {43 return getpid();44 }