操作系统第2次实验报告:创建进程
Posted caibanye
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统第2次实验报告:创建进程相关的知识,希望对你有一定的参考价值。
- 李微微
- 201821121001
- 计算1811
1. 编写程序
在服务器上用VIM编辑器编写一个程序:一个进程创建(fork)两个子进程。
源代码:
1 #include <stdio.h> 2 #include <unistd.h> 3 #include <stdlib.h> 4 #include <sys/wait.h> 5 #define child 2 //两个子进程 6 int main() 7 { 8 pid_t pid; 9 printf("Parent:pid:%d ",getpid()); 10 for (int i = 0; i < child; i++) 11 { 12 pid=fork(); 13 if (pid==0) 14 { 15 printf("Child%d:pid:%d ",i+1,getpid()); 16 return 0; 17 } 18 else if(pid<0){ 19 printf("error in fork!"); 20 } 21 } 22 printf(" "); 23 sleep(20); //挂起进程,以便打印进程树 24 return 0; 25 }
2. 打印进程树
1所创建的进程如下:
打印1所创建的进程树结构:
3. 解读进程相关信息
(1) ps -ef
所创建进程中: UID:用户ID为liweiwei; PID:进程ID为10320; PPID:进程的父进程ID为10320; C:进程CPU使用资源的百分比为0; STIME:进程启动时间为15:42; TTY:进程终端的次要装置号码为pts/5; TIME:进程运行时长为0; CMD:进程所执行的指令为./fork;
(2) ps -aux
所创建进程中: USER:进程拥有者为liweiwei; PID:进程ID为10320; %CPU:进程占用的CPU使用率为0; %MEM:进程占用的内存使用率为0; VSZ:进程占用的虚拟内存大小为4508kb; RSS:进程占用的内存大小为792kb; TTY:进程终端的次要装置号码为pts/5; STAT:该进程的状态为S+; D 不可中断 Uninterruptible sleep (usually IO) R 运行 runnable(on run queue) S 中断 sleeping T 停止 traced or stopped Z 僵死 defunct (zombie) process W 无驻留页 < 高优先级进程 N 低优先级进程 L 内存锁页 s 包含子进程 + 位于后台的进程组. START:进程开始时间为15:42; TIME:进程运行时长为0; COMMAND:进程所执行的指令为./fork;
4. 通过该实验产生新的疑问及解答
问题:本次实验在使用VIM编写程序时,不小心退出了。再次使用VIM进入该文件,打算编辑时,显示“readonly”,不能编辑不能保存。
解决:经过搜索得知,是因为VIM被强制退出时,会产生一个相应的.swp文件(正常退出不会产生,该文件使用ls指令也能看到)。
用网上恢复文件,再删除.swp文件的方法行不通,可能是我操作错误,所以我先删除该程序文件,再使用rm -rf .fork.c.swp删除.swp文件,最后用VIM重新写这个程序,问题解决。
5. 加分项
(1)写一个输出Hello World的简单程序,分析Linux可执行文件构成。
(2)在VIM下查看可执行文件:
(3):%!xxd
将当前文本转换为16进制格式
1 00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............ 2 00000010: 0300 3e00 0100 0000 3005 0000 0000 0000 ..>.....0....... 3 00000020: 4000 0000 0000 0000 3019 0000 0000 0000 @.......0....... 4 00000030: 0000 0000 4000 3800 0900 4000 1d00 1c00 ....@.8...@..... 5 00000040: 0600 0000 0400 0000 4000 0000 0000 0000 ........@....... 6 00000050: 4000 0000 0000 0000 4000 0000 0000 0000 @.......@....... 7 00000060: 3f01 0000 0000 0000 3f01 0000 0000 0000 ?.......?....... 8 00000070: 0800 0000 0000 0000 0300 0000 0400 0000 ................ 9 00000080: 3802 0000 0000 0000 3802 0000 0000 0000 8.......8....... 10 00000090: 3802 0000 0000 0000 1c00 0000 0000 0000 8............... 11 000000a0: 1c00 0000 0000 0000 0100 0000 0000 0000 ................ 12 000000b0: 0100 0000 0500 0000 0000 0000 0000 0000 ................
(4)分析过程:
- .ELF看起来像个文件后缀,于是搜索了“ELF”,得知ELF是一种文件格式,用于二进制文件、可执行文件、目标代码等(来源:百度百科),即该文件的格式为ELF。
- 查看ELF文件:
- 通过上述两者的对比和查阅,分析如下:
Magic:对应十六进制文本的第一行,其中7f 45 4c 46 为魔数,表明为ELF对象;下一个02表示是一个64位对象;再下一个01表示高位在前(这对接下来十六进制文本的阅读很重要)。 Class:文件类,表明是64位程序。 Version:文件版本。 Type:标识文件类型,该程序为共享目标文件。对应十六进制文本第二行中的0x30。 Machine:对应十六进制文本中的第二行的0x3e,表示是Advanced Micro Devices X86-64处理器体系结构。 Entry point address:表示程序入口点地址,值为十六进制文本中的第二行的0x00003005(十六进制文本高位在前)。 Size of section headers:单个section header大小为64B。 Number of section headers:section headers的个数,该程序为29。 Section header string table index:section header字符串表在section header table中的索引。
- 查看section headers
从中可以看出.text、.data、.bss、.symtab、.strtab各个section及其对应的地址,猜测对应可执行文件的代码部分、数据部分、符号表、字符串表。
- 定位至输出文本,地址在区间内,基本可以肯定上述猜测。
综上,基本可以得出执行文件构成的代码部分、数据部分、符号表、字符串表。而代码重定位信息和数据重定位信息暂不知道在哪里体现。
以上是关于操作系统第2次实验报告:创建进程的主要内容,如果未能解决你的问题,请参考以下文章