1.编写程序
1.1利用vim文本编辑器编写一个fork.c的程序
1.2 编写完成,保存退出:wq,执行 gcc -o fork.c fork 命令,若无错误提示,即为编译成功。
2.打印进程树
2.1(1) 执行./fork & 可将进程挂起,并显示父进程进程号
(2)执行./fork 显示子进程和父进程进程号
2.2 执行 pstree -p 21671 打印进程树
3.解读进程相关信息
3.1 ps -ef
各字段的定义及值释义(以第一行为例):
- UID:进程所属用户,huangbiting是用户ID;
- PID:进程号,28523是28524(子进程),28525(子进程)父进程ID;;
- PPID:父进程号,20141是20383的父进程ID;
- C:占用的CPU使用率;
- STIME:进程运行的时间,进程0时0分0秒执行完成;
- TTY:终端的次要装置号码;pts/0为虚拟终端号,打开一个终端,这个终端就是pts/1,再打开一个,就是pts/2
- TIME:执行的时间;
- CMD:进程所执行的指令;一行的指令为./firsttest
(2) ps -aux
使用ps -aux
给出所创建进程的信息,根据进程号找到这次实验创建的进程。
分析字段:
USER:用户名。
PID:进程的ID 。
%CPU:进程占用的CPU百分比。
%MEM:占用内存的百分比 。
VSZ :该进程使用的虚拟內存量(KB)。
RSS :该进程占用的固定內存量(KB)(驻留中页的数量)。
STAT:进程的状态。(S:处于休眠状态,+:位于后台的进程组)
START:该进程被触发启动时间 。
4.疑惑及解答:
4.1在终端次要装置号码为什么是pts/0
查询发现,他就是一个终端号码,与开的终端数量有关
https://blog.csdn.net/weixin_34072857/article/details/86259660
4.2 sleep()函数在C语言中的意义?
在反复几次利用ps -ef
给出所创建进程的信息是时,都只有一条进程信息,通过询问了同学,得到修改sleep()函数值的方法,
去查阅资料后,明白这的功能是执行挂起一段时间,意味值这数值越小,执行挂起时间越短,以至于可能在执行ps -ef后,来不及查询,部分进程已经结束挂起。
用法:usigned sleep(unsigned seconds),注意,如果使用的头文件是#include
使用的头文件是#include
5.分析可执行文件构成
5.1、编写简单程序mytest.c,使用:%!xxd 和:%!xxd -r 实现与十六进制文本的切换
——mytest.c文件及其十六进制表示
——mytest(可执行文件及其十六进制表示)
使用objdump -h mytest 命令打印各个字段及的基本信息。
分析Linux可执行文件构成:
exec header(执行头部,也可理解为文件头部)
text segment(文本段)
data segment(数据段)
text relocations(文本重定位段)
data relocations(数据重定位段)
symbol table(符号表)
tring table(字符串表)
在分析可执行文件结构时 ,先分析可执行文件的生成:源代码->静态库文件->可执行文件
以mytest.c为例
(1)先经过预处器(cpp)处理为.i文件
gcc -E mytest.c -o mytest.i
再编译为汇编文件
gcc -S mytest.i -o mytest.s
再汇编为二进制的.o文件
gcc -c mytest.s -o mytest.o
(2)编译器(ccl)再处理为.a文件
.a文件实质上就是.o文件打了个包。一般把它叫做静态库文件。它在使用的时候,效果和使用.o文件是一样的。
(3)最后为.so文件
一个ELF格式的文件,也就是linux的可执行文件。