code:wait - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki
- 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) {
3279 f++;
- 遍历 proc,查找 当前进程 的子进程 p
- f 为 子进程数
3280 if(p->p_stat == SZOMB) {
3281 u.u_ar0[R0] = p->p_pid;
- 找到 结束(SZOMB)的子进程
- 以下完成 子进程的扫尾工作
3282 bp = bread(swapdev, p->p_addr);
- 返回 子进程号
3283 mfree(swapmap, 1, f);
- 从盘交换区 读取 子进程结束时写入的残留信息块
- 关于 残留信息块,参看exit
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;
3290 p = bp->b_addr;
- 将 子进程 的 proc结构 清零(初始化)
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];
- 结算 当前进程 的 子进程用户态时间
3298 brelse(bp);
- 保存 子进程 u_arg[0],方便父进程使用 (引自 LIONS 代码分析)
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 - 33113312 }
- 参看 LIONS源代码分析 13.19,或13.20,关于wait的章节
- SWTED 标志 在ptrace 处理
3313 if(f) {
3315 goto loop;
3316 }
3317 u.u_error = ECHILD;
- 若 存在子进程,但子进程未结束,则睡眠等待
- 睡眠原因 : struct proc
- 睡眠优先级 : PWAIT
3318 }
- 若不存在子进程,则抛出错误
- 错误代码 : ECHILD
3319 /* ------------------------- */
- (wait = 7.)
- sys wait
- (process ID in r0)
- (status in r1)