0.个人信息
姓名:王璐璐
学号:201821121037
班级:计算1812
1.编写程序
用vim编写程序——使用fork()创建两个子进程。代码如下:
#include <stdio.h> #include <sys/types.h> #include <unistd.h> int main(){ pid_t fpid; fpid=fork(); if(fpid<0){ printf("error"); } else if (fpid==0){ printf("child process 1,process id: %d\n",getpid()); } else{ pid_t fpid2=fork(); if(fpid2<0){ printf("error2"); } else if(fpid2==0){ printf("child process 2,process id: %d\n",getpid()); } else{ printf("parent process,process id: %d\n",getpid()); } sleep(500); //延迟100秒,进程挂起 } }
编译过程:
得到的程序运行结果图如下:
2.打印进程树
(1)在代码中创建完进程后,使用sleep(500)函数,将进程挂起了500秒。
(2)方法一:打开两个控制台,一个开启程序,一个打印进程树;
(3)使用命令打印出上述进程的进程树,结果如下:
其中15250为父进程的pid号,15251和15252分别为两个子进程的pid号
(4)方法二:用“&”将进程放置后台运行,再打印进程树
3.解读进程相关信息
3.1解读
(1)下图中红色框表示的是查找到的与创建的父子进程相关的进程信息:
(2)执行后,会有以下几个字段
UID PID PPID C STIME TTY TIME CMD
(3)根据执行fork.c程序,解释上述的几个字段含义:
①UID:表示用户的ID。在该实验中,用户ID是wanglulu,这是我登录服务器时的用户名;
②PID:表示某一个进程的ID号。在该实验中,fork.c创建了三个进程,其进程ID号分别为15250,15251,15252;
③PPID:表示某一个进程的父进程ID号。在该实验中,fork.c创建了一个父进程和两个子进程,从结果图中可以看出进程ID15251和15252的父进程ID均为15250;
④C:表示CPU使用的资源百分比。在该实验中,三个进程的资源百分比均为0;
⑤STIME:表示程序启动时间。从该实验的结果图中,可以发现创建父进程的同时会将两个子进程创建好,这三个进程的创建时间是一致的;
⑥TTY:表示进程与控制终端的关联值。由于fork.c中创建的三个进程是父子关系,这三个进程最后得到TTY值是一样的,值pts/1表示在桌面Linux中是标准输出;
⑦TIME:表示进程使用的总CPU时间。由结果图可知,创建进程无需使用CPU
⑧CMD:所下达的指令名称
3.2解读
(1)下图是执行命令后得到的字段结果:
(2)执行后,会有以下几个字段:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
(3)根据执行fork.c程序,解释上述的几个字段含义:
①USER:表示的含义与使用“ps -ef”中的字段“UID”相类似;
②PID:同“ps -ef”中的“PID”;
③%CPU:同“ps -ef”中的“C”;
④%MEM:表示该进程所占用的物理内存百分比。在该实验中显示这三个进程所占的物理内存百分比均为0;
⑤VSZ:表示的是该进程使用掉的虚拟内存量 (Kbytes)。由结果图可以看出父进程和第二个子进程均开辟了4508Kbytes大小的空间,由于第一个子进程处于僵死状态,第一个子进程并未占空间,即每次使用fork()创建一个进程时,都会开辟一个大小相同的虚拟内存空间;
⑥RSS:表示的是该进程占用的固定的内存量 (Kbytes)。从结果图中可以看出父进程所占用的固定内存量比子进程的大很多,子进程所占有的固定内存量是一致的;
⑦TTY:同“ps -ef”中的“TTY”;
⑧STAT:表示的是该程序目前的状态。由结果图中可以得出,父进程和第二个子进程正处于睡眠状态中,而第一个子进程处于终止状态,但父进程未将该子进程进行回收;
⑨START:表示的是该进程被触发启动的时间;
⑩TIME:表示的是该进程实际使用 CPU 运作的时间;COMMAND:同“ps -ef”中的“CMD”
4.问题
(1)创建的子进程中,第一个子进程的状态处于僵死状态,还未找到错误处;
5.相关链接
TTY值的取值含义解释:https://blog.csdn.net/u013115811/article/details/78849165