// proc.c
struct proc* copyproc(struct proc*);
void exit(void);
+int fork(void);
int growproc(int);
int kill(int);
void pinit(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
// 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.