void umain(void) { u_int who, i; i = 0; if ((who = sfork()) != 0) { printf("i am %08x; env is %p\n", sys_getenvid(), env); // get the ball rolling printf("send 0 from %x to %x\n", sys_getenvid(), who); ipc_send(who, 0, 0, 0); } for (;;) { ipc_recv(&who, 0, 0); printf("%x got %d from %x (env is %p %x)\n", sys_getenvid(), val, who, env, env->env_id); if (val == 10) return; ++val; ipc_send(who, 0, 0, 0); if (val == 10) return; } }
void umain(int argc, char **argv) { envid_t who; uint32_t i; i = 0; if ((who = sfork()) != 0) { cprintf("i am %08x; thisenv is %p\n", sys_getenvid(), thisenv); // get the ball rolling cprintf("send 0 from %x to %x\n", sys_getenvid(), who); ipc_send(who, 0, 0, 0); } while (1) { cprintf("%x prepare to recv from %x (thisenv is %p %x)\n", sys_getenvid(), who, thisenv, thisenv->env_id); ipc_recv(&who, 0, 0); cprintf("%x got %d from %x (thisenv is %p %x)\n", sys_getenvid(), val, who, thisenv, thisenv->env_id); if (val == 10) return; ++val; ipc_send(who, 0, 0, 0); if (val == 10) return; } }
void umain(int argc, char **argv) { envid_t env; cprintf("Father:%04x", sys_getenvid()); a=1; if ((env = sfork()) == 0) { while (1) { cprintf("child:a=%d\n",a); sys_yield(); } exit(); } sys_yield(); sys_yield(); sys_yield(); sys_yield(); sys_yield(); sys_yield(); cprintf("Father:a changed\n"); a=2; sys_yield(); sys_yield(); sys_yield(); sys_yield(); sys_yield(); sys_yield(); cprintf("Killing the child\n"); sys_env_destroy(env); }
void umain(int argc, char **argv) { int c = sfork(); if (c != 0){ cprintf("parent: %d\n", k); k = 255; } else { cprintf("child: %d\n", k); } }
void forkchild(const char *cur, char branch) { char nxt[DEPTH+1]; if (strlen(cur) >= DEPTH) return; snprintf(nxt, DEPTH+1, "%s%c", cur, branch); if (sfork() == 0) { forktree(nxt); exit(); } }