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

来源:互联网 发布:现在最流行的网络词语 编辑:程序博客网 时间:2024/05/16 09:21


调用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


0 0
原创粉丝点击