一、实验过程
1. 进入内核,将fork函数写入test.c文件中,并构建新的根文件系统
cd LinuxKernel
cd menu
vi test.c
make rootfs
//fork函数代码如下
#include <unistd.h>
int Fork(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");
}
}
//在main函数中写入如下代码
MenuConfig("fork","Fork a new process",Fork);
2. 进入gdb并进行调试
分别在sys_clone、do_fork、dup_task_struct、copy_process、copy_thread、ret_from_fork处设置断点:
开始调试:
二、总结
当Linux系统创建一个新进程,通常使用fork()系统调用,这使得当前进程复制出一个与其几乎完全相同的子进程。子进程继承了父进程的内存、文件描述符、状态等属性,但有自己的进程ID。虽然子进程初时使用其父进程的内存页面,但在尝试修改时会触发“写时复制”机制,为其创建新的内存页面。通常,子进程创建后,可以使用exec()系列函数来加载并执行新程序。