实验目的
这次实验的目的是跟踪进程的运行轨迹,记录下进程的状态及其变化
实现方法
实现方法在于对找出每一次进程的变化,并对应添加上相应的内核函数,使其能够打印出进程信息到process.log中
实验步骤
这次的实验耐心按照实验楼里的步骤做,问题应该不大!这里简略记录。
首先,我们需要想清何时创建用以记录的process.log文件?当然要尽早了,于是在我们进行第一次fork前,进程切换到用户态后,开始创建process.log文件,以记录进程。
此时创建的process.log的文件标识符为3,并且由于是在进程0中创建的,后面的子进程1同样会复制过去,init()也就不用再open它,不过实际上,init() 的后续代码和 /bin/sh 都会重新初始化它们。
注意除了创建process.log文件外,还需将init()内加载文件系统的语句提前至此。
这里我们在fork.c文件里面,找出进程状态变化的语句p->state=TASK_RUNNING; 并且通过fprintk()内核函数,完成将对应进程信息打印在process.log文件中,这样便可以在进程状态变化时在.log文件中记录下状态啦
实验分析
当我下一次运行cat /var/process.log, 新增7,8两个进程id, 根据时间来看7应当是结束上一个指令后shell循环进入创建新进程
main()
{
char cmd[100];
while(1)
{
scanf();
if(!fork()) {execvp(cmd, NULL); }
wait();
}
}
而进程号8则是执行cat /var/process.log 得到的新进程.
那么前面最开始的几个进程号是什么呢?这部分的故事可以参阅《源码》man.c部分的内容。
注:这里只放出了创建进程(fork)中的记录方式,同理,我们可以找到进程状态的切换点,并且相应的记录下进程状态~