本周主要是研究的是Linux下的进程控制
先回顾一下知识点
½ :新生(new):进程新产生中。
⅓ :运行(running):正在运行。
¼ :等待(wating):等待某事发生,例如等待用户输入完成。
⅕ :就绪(ready):排队中,等待CPU。
⅙ :退出(terminated):完成运行。
主要关系如图
多余过程不再赘述,直接看图
启动内核(冻结)
gdb,设置断点,观察
代码分析
struct task_struct *p;//创建进程描述符指针
int trace = 0;
long nr;//子进程pid
p = copy_process(clone_flags, stack_start, stack_size,
child_tidptr, NULL, trace);//创建子进程的描述符和执行时所需的其他数据结构
if (!IS_ERR(p)) {//如果copy_process执行成功
struct completion vfork;//定义完成量
struct pid *pid;
pid = get_task_pid(p, PIDTYPE_PID);//获得task结构体中的pid
nr = pid_vnr(pid);//根据pid结构体中获得进程pid
//如果clone_flags包含CLONE_VFORK标志,就将完成量vfork赋值给进程描述符中的vfork_done字段,此处只是对完成量进行初始化
if (clone_flags & CLONE_VFORK) {
p->vfork_done = &vfork;
init_completion(&vfork);
get_task_struct(p);
}
wake_up_new_task(p);//将子进程添加到调度器的队列,使之有机会获得CPU
/* forking complete and child started to run, tell ptracer */
//如果clone_flags包含CLONE_VFORK标志,就将父进程插入等待队列直到子进程调用exec函数或退出,此处是具体的阻塞
if (clone_flags & CLONE_VFORK) {
if (!wait_for_vfork_done(p, &vfork))
ptrace_event_pid(PTRACE_EVENT_VFORK_DONE, pid);
}
总结
本周修改了cnblogs的样式,另外这周的很多的操作步骤都是上周的,但是依然学习到了一些新的知识。