操作系统第2次实验报告:创建进程
------------恢复内容开始------------
- 姓名:蒋浩天
- 学号:201821121024
- 班级:计算1811
1. 编写程序
在服务器上用VIM编辑 器编写一个程序:一个进程创建(fork)两个子进程。给出源代码:
1 #include<sys/types.h> 2 #include<unistd.h> 3 #include<stdio.h> 4 int main() 5 { 6 pid_t pid; 7 for(int i=0;i<2;i++){ 8 pid=fork(); 9 if(pid<=0) 10 break; 11 } 12 if(pid<0) 13 printf("error in fork!"); 14 else if(pid==0) 15 printf("child process,my process id is %d\n",getpid()); 16 else 17 printf("parent process,my process id is %d\n",getpid()); 18 sleep(300); 19 return 0; 20 }
运行结果:
2. 打印进程树
3. 解读进程相关信息
(1) ps -ef
使用ps -ef
给出所创建进程的信息,根据进程号找到这次实验创建的进程。
UID PID PPID C STIME TTY TIME CMD ... jiangha+ 21971 16560 0 11:16 pts/4 00:00:00 ./a.out jiangha+ 21972 21971 0 11:16 pts/4 00:00:00 ./a.out jiangha+ 21973 21971 0 11:16 pts/4 00:00:00 ./a.out
分析字段:
UID:用户ID(但输出的是用户名)
PID:进程的ID
PPID:父进程的ID (可以看到进程21972、21973的父进程都是21971,符合实验)
C:进程占用CPU的百分比。
STIME:进程启动的时间 。
TTY:该进程在哪个终端上运行,若与终端无关,则显示? 若为pts/0等,则表示由网络连接主机进程。
TIME: 进程使用CPU的时间。
CMD:命令的名称和参数。
(2) ps -aux
使用ps -aux
给出所创建进程的信息,根据进程号找到这次实验创建的进程。
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND ... jiangha+ 21971 0.0 0.0 4508 744 pts/4 S+ 11:16 0:00 ./a.out jiangha+ 21972 0.0 0.0 4508 72 pts/4 S+ 11:16 0:00 ./a.out jiangha+ 21973 0.0 0.0 4508 72 pts/4 S+ 11:16 0:00 ./a.out
分析字段:
USER:用户名。
PID:进程的ID 。
%CPU:进程占用的CPU百分比。
%MEM:占用内存的百分比 。
VSZ :该进程使用的虚拟內存量(KB)。
RSS :该进程占用的固定內存量(KB)(驻留中页的数量)。
STAT:进程的状态。(S:处于休眠状态,+:位于后台的进程组)
START:该进程被触发启动时间 。
4. 通过该实验产生新的疑问及解答
刚开始写的程序,不太理解父进程和子进程产生的原理,得到的是一个父进程跟两个子进程,其中一个子进程后面还跟一个子进程,不符合要求。经过多次修改代码,观察进程树,最后解决。
刚开始运行的时候,运行到结束很迅速,没办法得到进程树。根据报告的提示,在代码中放入sleep挂起进程。
在用ps -ef、ps -aux给出进程信息时,得到的是全部进程的信息,我是通过进程号,找到并只截取了实验要的进程。后来发现可以通过ps -ef|grep 指令直接查找到想要的进程。在这里,grep命令是查找,中间的|是管道命令,是指ps命令与grep同时执行。