code:fork - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki

Source

  • fork 的系统调用函数
  • 用于生成子进程
  • 返回值
    • 父进程 返回 子进程进程号
    • 子进程 返回 0(子进程返回值 设置 参看系统调用:fork)

3320

3321 /* fork system call. */

3322 fork()

3323 {

3324     register struct proc *p1, *p2;

3325

3326     p1 = u.u_procp;

3327     for(p2 = &proc[0]; p2 < &proc[NPROC]; p2++)

3328          if(p2->p_stat == NULL)

3329           goto found;

3330     u.u_error = EAGAIN;

3331     goto out;

  • proc 表 中查找空闲项
  • 注:在3334 newproc中 其实也执行类似的代码
但是 newproc 中对于没有找到空闲项的情况 处理过于暴力(抛出错误,等待用户干预) 故在这里采用温和的方式处理错误(同时 也形成了 代码冗余)
3332

3333 found:

3334     if(newproc()) {

  • 以下代码由子进程运行
  • 初始化 子进程参数
  • 置 子进程 fork 返回值 为 父进程进程号(会被清零,参看系统调用:fork)
3335          u.u_ar0[R0] = p1->p_pid;

3336          u.u_cstime[0] = 0;

3337          u.u_cstime[1] = 0;

3338          u.u_stime = 0;

3339          u.u_cutime[0] = 0;

3340          u.u_cutime[1] = 0;

3341          u.u_utime = 0;

3342          return;

3343     }

3344          u.u_ar0[R0] = p2->p_pid;

  • 父进程 返回值 置为 子进程进程号
3345

3346 out:

3347     u.u_ar0[R7] =+ 2;

3348 }

3349 /* ------------------------- */

Ref

Param

(fork = 2.)
sys fork
(new process return)
(old process return)
⚠️ **GitHub.com Fallback** ⚠️