- 姓名 邹文兵
- 学号 201821121028
- 班级 计算1811
1. 编写程序
在服务器上用VIM编辑器编写一个程序:一个进程创建(fork)两个子进程。给出源代码:
#include <stdio.h>
#include <sys/types.h>
#include<unistd.h>
int main(){
pid_t pid1=fork(),pid2;
if(pid1==0)
printf("子进程1的ID号为:%d\n",getpid());
else if(pid1<0)
printf("创建子进程1出错!\n");
else {
printf("父进程1的ID号为:%d\n",getpid());
pid2=fork();
if(pid2==0)
printf("子进程2的ID号为:%d\n",getpid());
else if(pid2<0)
printf("创建子进程2出错!\n");
else
printf("父进程2的ID号为:%d\n",getpid());
}
sleep(2000);
return 0;
}
源代码运行结果截图:
2. 打印进程树
打印1所创建的进程树结构,给出带有自己名字的截图。
提示:
- 使用
unsigned sleep(unsigned seconds)
挂起进程,以便打印进程树 - 打印进程树命令
pstree -p pid
3. 解读进程相关信息
(1) ps -ef
zouwenbing@jmu-cs-ubuntu:~$ ps -ef
UID PID PPID C STIME TTY TIME CMD
zouwenb+ 7721 7011 0 14:33 pts/2 00:00:00 ./two_child
zouwenb+ 7722 7721 0 14:33 pts/2 00:00:00 ./two_child
zouwenb+ 7723 7721 0 14:33 pts/2 00:00:00 ./two_child
使用ps -ef
给出所创建进程的信息,并分析每个字段的含义:
UID : 用户的ID号为:zouwenbing
PID : 该进程的ID号:如上程序由一个进程号为7721,创建了两个子进程号分别为:7722,7723
PPID :父进程的ID号: 如上程序两个子进程的父进程ID号(PPID)都为7721,可知是由同一个父进程所创建。
C :CPU占用的百分比,该进程CPU占比为0%
STIME :进程开始的时间 :该进程开始时间为14:33
TTY :控制tty的终端设备号 :pts/2
TIME :使用掉的CPU时间,该进程未占CPU,故使用掉的时间为00:00:00
CMD :可执行文件的简单名称,two_child
(2) ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
zouwenb+ 19453 0.0 0.2 20580 3848 pts/1 S+ 15:49 0:00 man ps all
zouwenb+ 19463 0.0 0.1 9192 2500 pts/1 S+ 15:49 0:00 pager
zouwenb+ 20802 0.0 0.1 39008 3616 pts/3 R+ 15:55 0:00 ps -aux
USER:用户的名字
PID:进程的ID号:19453(以下都以第一条作为参考)
%CPU:进程的cpu利用率,它是CPU使用时间除以进程运行的时间:0%
%MEM:进程的常驻集大小与机器上的物理内存,表示为百分比:0.2%
VSZ: 该进程使用的虚拟內存量(KB)
RSS :该进程占用的固定內存量(KB)(驻留中页的数量)
STAT :进程的状态 :S+ 处于休眠状态
其中STAT状态位常见的状态字符有:
D 无法中断的休眠状态(通常 IO 的进程);
R 正在运行可中在队列中可过行的;
S 处于休眠状态;
T 停止或被追踪;
W 进入内存交换 (从内核2.6开始无效);
X 死掉的进程 (基本很少见);
Z 僵尸进程;
< 优先级高的进程
N 优先级较低的进程
L 有些页被锁进内存;
s 进程的领导者(在它之下有子进程);
l 多线程,克隆线程(使用 CLONE_THREAD, 类似 NPTL pthreads);
+ 位于后台的进程组;
START: 该进程被触发启动时间该进程实际使用CPU运行的时间
COMMAND:指令的具体内容:man ps all
使用ps -aux
给出所创建进程的信息,并分析每个字段的含义。
4. 通过该实验产生新的疑问及解答
通过该实验如果有产生新的疑问,可以写出来,并尝试自己解决问题。
产生的问题:在编写程序产生两个子程序的过程中总是会产生多个子程序,
解决方法:深刻的了解fork()函数产生子程序的过程,它在产生子程序时该子程序是接着在fork()函数后的所有代码都在次执行一遍,但是此时的返回值为:0,而在父程序时的返回值为:子程序的程序号。根据这些性质写出相应的代码实现。