0.個人信息
姓名:王璐璐
學號:201821121037
班級:計算1812
1.編寫程序
用vim編寫程序——使用fork()創建兩個子進程。代碼如下:
#include <stdio.h> #include <sys/types.h> #include <unistd.h> int main(){ pid_t fpid; fpid=fork(); if(fpid<0){ printf("error"); } else if (fpid==0){ printf("child process 1,process id: %d\n",getpid()); } else{ pid_t fpid2=fork(); if(fpid2<0){ printf("error2"); } else if(fpid2==0){ printf("child process 2,process id: %d\n",getpid()); } else{ printf("parent process,process id: %d\n",getpid()); } sleep(500); //延遲100秒,進程掛起 } }
編譯過程:
得到的程序運行結果圖如下:
2.打印進程樹
(1)在代碼中創建完進程后,使用sleep(500)函數,將進程掛起了500秒。
(2)方法一:打開兩個控制台,一個開啟程序,一個打印進程樹;
(3)使用命令打印出上述進程的進程樹,結果如下:
其中15250為父進程的pid號,15251和15252分別為兩個子進程的pid號
(4)方法二:用“&”將進程放置后台運行,再打印進程樹
3.解讀進程相關信息
3.1解讀
(1)下圖中紅色框表示的是查找到的與創建的父子進程相關的進程信息:
(2)執行后,會有以下幾個字段
UID PID PPID C STIME TTY TIME CMD
(3)根據執行fork.c程序,解釋上述的幾個字段含義:
①UID:表示用戶的ID。在該實驗中,用戶ID是wanglulu,這是我登錄服務器時的用戶名;
②PID:表示某一個進程的ID號。在該實驗中,fork.c創建了三個進程,其進程ID號分別為15250,15251,15252;
③PPID:表示某一個進程的父進程ID號。在該實驗中,fork.c創建了一個父進程和兩個子進程,從結果圖中可以看出進程ID15251和15252的父進程ID均為15250;
④C:表示CPU使用的資源百分比。在該實驗中,三個進程的資源百分比均為0;
⑤STIME:表示程序啟動時間。從該實驗的結果圖中,可以發現創建父進程的同時會將兩個子進程創建好,這三個進程的創建時間是一致的;
⑥TTY:表示進程與控制終端的關聯值。由於fork.c中創建的三個進程是父子關系,這三個進程最后得到TTY值是一樣的,值pts/1表示在桌面Linux中是標准輸出;
⑦TIME:表示進程使用的總CPU時間。由結果圖可知,創建進程無需使用CPU
⑧CMD:所下達的指令名稱
3.2解讀
(1)下圖是執行命令后得到的字段結果:
(2)執行后,會有以下幾個字段:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
(3)根據執行fork.c程序,解釋上述的幾個字段含義:
①USER:表示的含義與使用“ps -ef”中的字段“UID”相類似;
②PID:同“ps -ef”中的“PID”;
③%CPU:同“ps -ef”中的“C”;
④%MEM:表示該進程所占用的物理內存百分比。在該實驗中顯示這三個進程所占的物理內存百分比均為0;
⑤VSZ:表示的是該進程使用掉的虛擬內存量 (Kbytes)。由結果圖可以看出父進程和第二個子進程均開辟了4508Kbytes大小的空間,由於第一個子進程處於僵死狀態,第一個子進程並未占空間,即每次使用fork()創建一個進程時,都會開辟一個大小相同的虛擬內存空間;
⑥RSS:表示的是該進程占用的固定的內存量 (Kbytes)。從結果圖中可以看出父進程所占用的固定內存量比子進程的大很多,子進程所占有的固定內存量是一致的;
⑦TTY:同“ps -ef”中的“TTY”;
⑧STAT:表示的是該程序目前的狀態。由結果圖中可以得出,父進程和第二個子進程正處於睡眠狀態中,而第一個子進程處於終止狀態,但父進程未將該子進程進行回收;
⑨START:表示的是該進程被觸發啟動的時間;
⑩TIME:表示的是該進程實際使用 CPU 運作的時間;COMMAND:同“ps -ef”中的“CMD”
4.問題
(1)創建的子進程中,第一個子進程的狀態處於僵死狀態,還未找到錯誤處;
5.相關鏈接
TTY值的取值含義解釋:https://blog.csdn.net/u013115811/article/details/78849165