才半页

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  • 李微微
  • 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\n",getpid());
 10     for (int i = 0; i < child; i++)
 11     {
 12         pid=fork();
 13         if (pid==0)
 14         {
 15             printf("Child%d:pid:%d\n",i+1,getpid());
 16             return 0;
 17         }
 18         else if(pid<0){
 19             printf("error in fork!");
 20         }
 21     }
 22     printf("\n");
 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及其对应的地址,猜测对应可执行文件的代码部分、数据部分、符号表、字符串表。

           

  • 定位至输出文本,地址在区间内,基本可以肯定上述猜测。

         综上,基本可以得出执行文件构成的代码部分、数据部分、符号表、字符串表。而代码重定位信息和数据重定位信息暂不知道在哪里体现。

posted on 2020-04-04 12:55  才半页  阅读(338)  评论(0编辑  收藏  举报