您的位置:首页 > 运维架构 > Linux

分析Linux内核创建一个新进程的过程

2015-04-11 20:48 316 查看
调用fork函数创建一个进程

在test.c文件中添加函数块如下:

int Fork()
{
pid_t pid;
pid=fork();
if(pid<0)
{
fprintf(stderr,"Fork Failed");
return -1;
}
else if(pid==0)
{
printf("This is Child Process,pid=%d\n",pid);
return pid;
}
else
{
printf("This is parent process,pid=%d\n",pid);
wait(NULL);
printf("Child complete!\n");
return pid;
}
}


并添加头文件#include <unistd.h>

将工作空间不必要的文件清理后,执行“make”命令



编译成功之后,执行“./test”命令



然后输入“Fork”命令,得如下结果,



输出信息表示的是父子进程的创建信息。

在gdb中跟踪调试情况如下:

首先执行命令:

“qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S”启动调试窗口。

然后重新打开一个终端,分别顺序执行如下三条指令:







在do_fork,copy_process,copy_thread三处设置断点,其执行顺序如下:







可以看出fork函数在这三个地方均以系统调用的方式访问内核。也可见其访问内核的顺序。

当然fork函数访问的系统调用远不止这三处,试验还在sys_clone和dup_task_struct处设置过断点,也追踪到了系统运行的流程。总体上说,这是一个复杂的过程。单凭单步调试和设置断点的方式,很难将其一一追踪到。此处也是管中窥豹,大体上了解fork系统调用的方式。

《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: