# Fork System Call ### fork() 的流程 * 把 parent 的 pagetable 複製給 child * child 中回傳的是 0 * parent 中回傳的是 child pid ### fork 的特性 * 這是唯一 new 出 process 的方法 ### 程式碼追蹤 ```clike= // Create a new process, copying the parent. // Sets up child kernel stack to return as if from fork() system call. int fork(void) { int i, pid; struct proc *np; struct proc *p = myproc(); // 首先 allocate 出一個新的 process if((np = allocproc()) == 0){ return -1; } // 把 parent 的 patetable 的內容複製一份給 child // 包含了 pagetable 以及 memory 的內容也複製了一份 if(uvmcopy(p->pagetable, np->pagetable, p->sz) < 0){ freeproc(np); release(&np->lock); return -1; } np->sz = p->sz; // size of process memory (bytes) // 把 parent 的 trapfram 複製給 child // 也就是要有一樣了 register 的值 *(np->trapframe) = *(p->trapframe); // 少數不一樣的地方在於,child 回傳的值為 0 // 複製一些其他的東西過去 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; // 這裡有一些 deadlock 的議題要處理 // 注意看 child 的 lock(np->pid) // 先 release 了 np->lock release(&np->lock); acquire(&wait_lock); np->parent = p; release(&wait_lock); acquire(&np->lock); np->state = RUNNABLE; release(&np->lock); return pid; } ``` * `wait_lock` 的作用為何? * 為什麼會需要先 release `np->lock` 之後再重新 aquire? ### deadlock 的問題
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up