diff --git a/defs.h b/defs.h index fe863cd0f8e374677db5196bac82334c2caa0cfe..cb47716375dced2fcd187c084bfb3e3005f7a13b 100644 --- a/defs.h +++ b/defs.h @@ -94,6 +94,7 @@ int pipewrite(struct pipe*, char*, int); // proc.c struct proc* copyproc(struct proc*); void exit(void); +int fork(void); int growproc(int); int kill(int); void pinit(void); @@ -146,9 +147,9 @@ void tvinit(void); extern struct spinlock tickslock; // uart.c -void uartinit(void); -void uartintr(void); -void uartputc(int); +void uartinit(void); +void uartintr(void); +void uartputc(int); // number of elements in fixed-size array diff --git a/proc.c b/proc.c index 20f4be978c70c133155d971c0ec814410dbb8a18..a2aeab2884906b4c06ce6878d071be426c4fae03 100644 --- a/proc.c +++ b/proc.c @@ -130,34 +130,40 @@ usegment(void) // Create a new process copying p as the parent. // Sets up stack to return as if from system call. // Caller must set state of returned proc to RUNNABLE. -struct proc* -copyproc(struct proc *p) +int +fork(void) { - int i; + int i, pid; struct proc *np; // Allocate process. if((np = allocproc()) == 0) - return 0; + return -1; // Copy process state from p. - np->sz = p->sz; + np->sz = cp->sz; if((np->mem = kalloc(np->sz)) == 0){ kfree(np->kstack, KSTACKSIZE); np->kstack = 0; np->state = UNUSED; - return 0; + return -1; } - memmove(np->mem, p->mem, np->sz); - np->parent = p; - *np->tf = *p->tf; + memmove(np->mem, cp->mem, np->sz); + np->parent = cp; + *np->tf = *cp->tf; - for(i = 0; i < NOFILE; i++) - if(p->ofile[i]) - np->ofile[i] = filedup(p->ofile[i]); - np->cwd = idup(p->cwd); + // Clear %eax so that fork returns 0 in the child. + np->tf->eax = 0; - return np; + for(i = 0; i < NOFILE; i++) + if(cp->ofile[i]) + np->ofile[i] = filedup(cp->ofile[i]); + np->cwd = idup(cp->cwd); + + pid = np->pid; + np->state = RUNNABLE; + + return pid; } // Set up first user process. diff --git a/sysproc.c b/sysproc.c index da01b5b363114ed27914a4b40304e8a12aeb3101..5ecbf2b7aca17d2849757c6199332bfbfaa296d8 100644 --- a/sysproc.c +++ b/sysproc.c @@ -8,17 +8,7 @@ int sys_fork(void) { - int pid; - struct proc *np; - - if((np = copyproc(cp)) == 0) - return -1; - pid = np->pid; - - // Clear %eax so that fork returns 0 in the child. - np->tf->eax = 0; - np->state = RUNNABLE; - return pid; + return fork(); } int