code:ptrace - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki
其他情况 由父进程调用ptrace
4160
4161 /*
4162 * sys-trace system call.
4163 */
4164 ptrace()
4165 {
4166 register struct proc *p;
4167
4168 if (u.u_arg[2] <= 0) {
4169 u.u_procp->p_flag =| STRC;
4170 return;
4171 }
4168 - 4171
- 由子进程运行(参看跟踪)
- 子进程 置 STRC (跟踪标志)
4172 for (p=proc; p < &proc[NPROC]; p++)
- 以下由 父进程 运行
4173 if (p->p_stat==SSTOP
4174 && p->p_pid==u.u_arg[0]
4175 && p->p_ppid==u.u_procp->p_pid)
4176 goto found;
4177 u.u_error = ESRCH;
- 查找 匹配的子进程
- 状态 为 SSTOP
- 进程号 为 pid
- 当前进程 的 子进程
4178 return;
- 找不到指定的子进程,则抛出错误
- 错误代码 : ESRCH
4179
4180 found:
4181 while (ipc.ip_lock)
4183 ipc.ip_lock = p->p_pid;
4184 ipc.ip_data = u.u_ar0[R0];
4185 ipc.ip_addr = u.u_arg[1] & ~01;
LIONS 源代码为[[code:ipc|ipc]].ip_addr - u.u_arg[1] & ~01;
疑为笔误
4183 - 41864187 p->p_flag =& ~SWTED;
- 填写 ipc 参数(跟踪请求参数)
4188 setrun(p);
4189 while (ipc.ip_req > 0)
- 子进程 清 SWTED 标志
- 唤醒 子进程
4191 u.u_ar0[R0] = ipc.ip_data;
4192 if (ipc.ip_req < 0)
- 返回值 置 跟踪请求处理后的数据
4193 u.u_error = EIO;
4194 ipc.ip_lock = 0;
- 请求处理 错误,则抛出错误
- 错误代码 : EIO
4196 }
4197 /* ------------------------- */
- (ptrace = 26.; not in assembler)
- (data in r0)
- sys ptrace; pid; addr; request
- (value in r0)