作業系統第2次實驗報告:創建進程

 零、個人資訊

  • 姓名:陳韻
  • 學號:201821121053
  • 班級:計算1812

 一、編寫程式

  在伺服器上用VIM編輯器編寫一個程式:一個進程創建(fork)兩個子進程。

    cyFork.cpp源程式碼如下:

 1 #include <stdio.h>   2 #include <unistd.h>   3 int main()   4 {   5     int pid1, pid2; //創建2個子進程   6     pid1 = fork();   7     if (pid1 == -1)   8     {   9         printf("fork錯誤!!n");  10         return 0;  11     }  12     else if (pid1 == 0)  13     {  14         printf("子進程1的id為:%dn", getpid());  15     }  16     else  17     {  18         //為父進程,則創建第二個子進程  19         pid2 = fork();  20         if (pid2 == -1)  21         {  22             printf("fork錯誤!!n");  23             return 0;  24         }  25         else if (pid2 == 0)  26         {  27             printf("子進程2的id為:%dn", getpid());  28         }  29         else  30         {  31             printf("父進程的id為:%dn", getpid());  32         }  33         sleep(300);  //延遲便於掛起進程  34     }  35 }

 

 二、列印進程樹

  1、編譯並運行cyFork.cpp文件,同時將進程掛起至後台,以便列印進程樹。

    (18035即為父進程的ID)

 

   將上述命令運行後得到如下結果:

   

 

    2、利用進程樹的列印命令,根據父進程的ID列印出進程樹。

 

     

 

 三、解讀進程的相關資訊

  1、ps -ef命令 (grep用於快速篩選出我剛創建的進程)

1 chenyun@jmu-cs-ubuntu:~$ ps -ef | grep "cy"  2 欄位:  UID     PID  PPID   C STIME    TTY    TIME  CMD  3     chenyun  18035 15168  0 16:28   pts/3    00:00:00 ./cy  4     chenyun  18036 18035  0 16:28   pts/3    00:00:00 ./cy  5     chenyun  18037 18035  0 16:28   pts/3    00:00:00 ./cy

  對各個欄位的解釋如下:

  • UID:用戶ID
  • PID:進程ID
  • PPID:父進程的ID
  • C:進程佔用CPU的百分比
  • STIME:進程啟動的時間
  • TTY:該進程在哪個終端機器上運作,若與終端機無關,則顯示? ; 若為pts/0等等,則表示遠程登錄。這裡pts/3表示我是遠程登錄
  • TIME:進程實際使用CPU的時間
  • CMD:所下達的命令名稱,這裡運行了文件cy: ./cy    

   

  2、ps -aux命令 

1 chenyun@jmu-cs-ubuntu:~$ ps -aux | grep "cy"  2  欄位: USER   PID   %CPU  %MEM    VSZ    RSS   TTY  STAT  START  TIME  COMMAND  3   chenyun  18035  0.0   0.0     4508   748   pts/3    S    16:28    0:00  ./cy  4   chenyun  18036  0.0   0.0     4508    68   pts/3    S    16:28    0:00  ./cy  5   chenyun  18037  0.0   0.0     4508    68   pts/3    S    16:28    0:00  ./cy

 

  對各個欄位的解釋如下:

  • USER:該進程的使用者帳號
  • PID:進程的ID
  • %CPU:進程佔用CPU資源百分比
  • %MEM:進程佔用物理記憶體百分比
  • VSZ:進程使用掉的虛擬記憶體量(Kbytes)
  • RSS:進程佔用的固定記憶體量(Kbytes)
  • TTY:該進程在哪個終端機器上運作,若與終端機無關,則顯示? ; 若為pts/0等等,則表示遠程登錄。這裡pts/3表示我是遠程登錄
  • STAT:該進程目前的狀態。這裡列舉出主要的狀態如下:
  1. R:run該程式目前正在運作,或位於隊列中
  2. S:sleep該程式目前正在睡眠中
  3. T:track or stop該程式目前正停止或者被追蹤
  4. Z:zombie該進程已終止,但是其父進程沒有將其回收,導致其成為殭屍進程
  • START:進程啟動的時間
  • TIME:進程實際使用CPU的時間
  • COMMAND:所下達的命令名稱,這裡運行了文件cy: ./cy  

 四. 通過該實驗產生新的疑問及解答

  1、在VIM編輯程式碼沒有提示功能很難受,因此我試圖自己用編輯器編寫完cpp程式碼再拷貝到VIM里,但格式錯亂。

  可以在VIM中運行命令set paste,當下面的INSERT後跟著(paste),表明進入粘貼模式  

  2、我如何快速查看我所創建的進程的相關資訊?

  在ps命令後利用管道與grep命令,快速篩選出匹配的資訊。

  3、當我調用ps命令時,即使利用了快速匹配搜索,也無法找到我所創建的進程的相關資訊。

  我盲猜是進程被掛起的時間太短導致我在試圖輸出進程資訊時,進程終止了。審查源程式碼時發現果不其然,當我把sleep函數的時間設置得更長後,我成功輸出了進程的相關資訊。

Tags: