Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int
- fork(void)
- {
- int i, pid;
- struct proc *np;
- struct proc *p = myproc();
- // Allocate process.
- if((np = allocproc()) == 0){
- return -1;
- }
- // Copy user memory from parent to child.
- if(uvmcopy(p->pagetable, np->pagetable, p->sz) < 0){
- freeproc(np);
- release(&np->lock);
- return -1;
- }
- np->sz = p->sz;
- np->parent = p;
- // copy saved user registers.
- *(np->tf) = *(p->tf);
- // Cause fork to return 0 in the child.
- np->tf->a0 = 0;
- // increment reference counts on open file descriptors.
- for(i = 0; i < NOFILE; i++)
- if(p->ofile[i])
- np->ofile[i] = filedup(p->ofile[i]);
- np->cwd = idup(p->cwd);
- safestrcpy(np->name, p->name, sizeof(p->name));
- pid = np->pid;
- np->state = RUNNABLE;
- release(&np->lock);
- return pid;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement