标签:
【益西拉姆 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000】
进程控制块PCB——task_struct
为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息。
`#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char * argv[])
{
int pid;
/ * fork another process */
pid = fork();
if (pid < 0)
{
/* error occurred */
fprintf(stderr,"Fork Failed!");
exit(-1);
}
else if (pid == 0)
{
/* child process */
printf("This is Child Process!\n");
}
else
{
/* parent process */
printf("This is Parent Process!\n");
/* parent will wait for the child to complete*/
wait(NULL);
printf("Child Complete!\n");
}
}
`
Linux通过复制父进程来创建一个新进程,那么这就给我们理解这一个过程提供一个想象的框架:
err = arch_dup_task_struct(tsk, orig);
`ti = allocthreadinfo_node(tsk, node);
tsk->stack = ti;
setupthreadstack(tsk, orig); //这里只是复制,而非复制内核堆`
*childregs = *current_pt_regs(); //复制内核堆栈
childregs->ax = 0; //为什么子进程的fork返回0,这里就是原因!
p->thread.sp = (unsigned long) childregs; //调度到子进程时的内核栈顶
p->thread.ip = (unsigned long) ret_from_fork; //调度到子进程时的第一条指令地址
到了159、160行的代码就是把压入的代码再放到子进程中:
`*children = *current_pt_regs();
childregs->ax = 0;`
p->thread.ip = (unsigned long) ret_from_fork;
本周主要就是课本的进程一章的拓展,通过实践来更加的运用完整,很有趣。
20135239益西拉姆 Linux内核分析 进程的描述和进程的创建
标签:
原文地址:http://www.cnblogs.com/20135239-yxlm/p/5349566.html