提交 21573833 创建 作者: rsc's avatar rsc

move fork into proc.c

上级 dae9b0d4
...@@ -94,6 +94,7 @@ int pipewrite(struct pipe*, char*, int); ...@@ -94,6 +94,7 @@ int pipewrite(struct pipe*, char*, int);
// proc.c // proc.c
struct proc* copyproc(struct proc*); struct proc* copyproc(struct proc*);
void exit(void); void exit(void);
int fork(void);
int growproc(int); int growproc(int);
int kill(int); int kill(int);
void pinit(void); void pinit(void);
...@@ -146,9 +147,9 @@ void tvinit(void); ...@@ -146,9 +147,9 @@ void tvinit(void);
extern struct spinlock tickslock; extern struct spinlock tickslock;
// uart.c // uart.c
void uartinit(void); void uartinit(void);
void uartintr(void); void uartintr(void);
void uartputc(int); void uartputc(int);
// number of elements in fixed-size array // number of elements in fixed-size array
......
...@@ -130,34 +130,40 @@ usegment(void) ...@@ -130,34 +130,40 @@ usegment(void)
// Create a new process copying p as the parent. // Create a new process copying p as the parent.
// Sets up stack to return as if from system call. // Sets up stack to return as if from system call.
// Caller must set state of returned proc to RUNNABLE. // Caller must set state of returned proc to RUNNABLE.
struct proc* int
copyproc(struct proc *p) fork(void)
{ {
int i; int i, pid;
struct proc *np; struct proc *np;
// Allocate process. // Allocate process.
if((np = allocproc()) == 0) if((np = allocproc()) == 0)
return 0; return -1;
// Copy process state from p. // Copy process state from p.
np->sz = p->sz; np->sz = cp->sz;
if((np->mem = kalloc(np->sz)) == 0){ if((np->mem = kalloc(np->sz)) == 0){
kfree(np->kstack, KSTACKSIZE); kfree(np->kstack, KSTACKSIZE);
np->kstack = 0; np->kstack = 0;
np->state = UNUSED; np->state = UNUSED;
return 0; return -1;
} }
memmove(np->mem, p->mem, np->sz); memmove(np->mem, cp->mem, np->sz);
np->parent = p; np->parent = cp;
*np->tf = *p->tf; *np->tf = *cp->tf;
for(i = 0; i < NOFILE; i++) // Clear %eax so that fork returns 0 in the child.
if(p->ofile[i]) np->tf->eax = 0;
np->ofile[i] = filedup(p->ofile[i]);
np->cwd = idup(p->cwd);
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. // Set up first user process.
......
...@@ -8,17 +8,7 @@ ...@@ -8,17 +8,7 @@
int int
sys_fork(void) sys_fork(void)
{ {
int pid; return fork();
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;
} }
int int
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论