0. 个人信息
- 姓名 罗廷杨
- 学号 201821121013
- 班级 计算1811
1. 编写程序
在服务器上用VIM编辑器编写一个程序:一个进程创建(fork)两个子进程。给出源代码:
#include<sys/types.h> #include<unistd.h> #include<stdio.h> #include<stdlib.h> int main() { int i; pid_t pid; //设置进程产生的个数 for(i=0;i<2;++i){ pid=fork(); if(pid<=0){ break; } } sleep(20);//进程挂起 if(pid<0){ //进程分配异常 perror("fork error\n"); } else if(pid==0){ //子进程 printf("\nThis is %d child ,pid=%u",i+1,getpid()); } else{ //父进程 printf("This is the parent,pid=%u",getpid()); } return 0; }
2. 打印进程树
1.编译1中所写的程序,并在后台运行
程序运行结果
2.根据父进程的PID,打印出进程树
3. 解读进程相关信息
(1) ps -ef
luotingyang@jmu-cs-ubuntu:~/File$ ps -ef | grep "ft" UID PID PPID C STIME TTY TIME CMD luoting+ 24266 15312 0 17:13 pts/11 00:00:00 ./ft luoting+ 24267 24266 0 17:13 pts/11 00:00:00 ./ft luoting+ 24268 24266 0 17:13 pts/11 00:00:00 ./ft
UID: 代表执行者的身份
PID: 进程的ID号
PPID: 父进程的ID,进程24266的父进程是进程15312,进程24267和进程24268的父进程是24266
C: CPU使用的资源百分比
STIME: 系统启动时间
TTY: 终端设备名称
TIME: 进程使用CPU的时间
CMD: 所下达的指令名称
(2) ps -aux
luotingyang@jmu-cs-ubuntu:~/File$ ps -aux | grep "ft" USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND luoting+ 24266 0.0 0.0 4376 748 pts/11 S 17:13 0:00 ./ft luoting+ 24267 0.0 0.0 4376 68 pts/11 S 17:13 0:00 ./ft luoting+ 24268 0.0 0.0 4376 68 pts/11 S 17:13 0:00 ./ft
USER: 进程拥有者
PID: 进程的ID号
%CPU: 占用的 CPU 使用率
%MEM: 占用的记忆体使用率
VSZ: 占用的虚拟记忆体大小
RSS: 占用的记忆体大小
TTY: 终端设备名称
STAT: 该进程的状态,S表示中断
START: 进程开始时间
TIME:进程使用CPU的时间
COMMAND:所执行的指令
4. 通过该实验产生新的疑问及解答
疑问:从C代码生成可执行文件的大致流程是什么样子的?
此处以一个fock_test.c源程序为例,fock_test.c源程序首先经过预处器(cpp)处理,变成fock_test.i文件,然后经过编译器(ccl)处理变成汇编程序fock_test.s,接着被汇编器(as)进行处理成为可重定位的目标程序(二进制)fock_test.o,最后经过链接器(ld)处理成为可执行的目标程序(二进制)fock_test。可执行文件的格式大致如下图所示: