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

Source

  • wait 的系统调用函数
  • 等待 当前进程的(某)子进程 结束(SZOMB)
  • 对于 子程序 暂停(SSTOP)的情况,也做了处理(列入遗留问题)
  • 返回值
    • 找到 结束的子进程,返回子进程号

3263

3264 /* Wait system call.

3265  * Search for a terminated (zombie) child,

3266  * finally lay it to rest, and collect its status.

3267  * Look also for stopped (traced) children,

3268  * and pass back status from them.

3269  */

3270 wait()

3271 {

3272     register f, *bp;

3273     register struct proc *p;

3274

3275     f = 0;

3276 loop:

3277     for(p = &proc[0]; p < &proc[NPROC]; p++)

3278          if(p->p_ppid == u.u_procp->p_pid) {

  • 遍历 proc,查找 当前进程 的子进程 p
  • f 为 子进程数
3279           f++;

3280           if(p->p_stat == SZOMB) {

  • 找到 结束(SZOMB)的子进程
  • 以下完成 子进程的扫尾工作
3281                u.u_ar0[R0] = p->p_pid;
  • 返回 子进程号
3282                bp = bread(swapdev, p->p_addr);
  • 从盘交换区 读取 子进程结束时写入的残留信息块
  • 关于 残留信息块,参看exit
3283                mfree(swapmap, 1, f);
  • 释放 盘交换区上的残留信息块
3284                p->p_stat = NULL;

3285                p->p_pid = 0;

3286                p->p_ppid = 0;

3287                p->p_sig = 0;

3288                p->p_ttyp = 0;

3289                p->p_flag = 0;

  • 将 子进程 的 proc结构 清零(初始化)
3290                p = bp->b_addr;

3291                u.u_cstime[0] =+ p->u_cstime[0];

3292                dpadd(u.u_cstime, p->u_cstime[1]);

3293                dpadd(u.u_cstime, p->u_stime);

  • 结算 当前进程 的 子进程核心态时间
3294                u.u_cutime[0] =+ p->u_cutime[0];
LIONS源代码为 3294 [[code:user|u.u_cstime]][0] =+ p->u_cutime[0]; 疑为笔误
3295                dpadd(u.u_cutime, p->u_cutime[1]);

3296                dpadd(u.u_cutime, p->u_utime);

  • 结算 当前进程 的 子进程用户态时间
3297                u.u_ar0[R1] = p->u_arg[0];
  • 保存 子进程 u_arg[0],方便父进程使用 (引自 LIONS 代码分析)
3298                brelse(bp);

3299                return;

3300           }

3301           if(p->p_stat == SSTOP) {

3302                if((p->p_flag&SWTED) == 0) {

3303                     p->p_flag =| SWTED;

3304                     u.u_ar0[R0] = p->p_pid;

3305                     u.u_ar0[R1] = (p->p_sig<<8) |

3306                                         0177;

3307                     return;

3308                }

3309                p->p_flag =& ~(STRC|SWTED);

3310                setrun(p);

3311           }

3301 - 3311
  • 参看 LIONS源代码分析 13.19,或13.20,关于wait的章节
  • SWTED 标志 在ptrace 处理
3312          }

3313     if(f) {

3314          sleep(u.u_procp, PWAIT);

3315          goto loop;

3316     }

3317     u.u_error = ECHILD;
  • 若不存在子进程,则抛出错误
3318 }

3319 /* ------------------------- */

Param

(wait = 7.)
sys wait
(process ID in r0)
(status in r1)
⚠️ **GitHub.com Fallback** ⚠️