- 姓名:呂煜華
- 學號:201821121046
- 班級:計算1812
1. 編寫程序
在服務器上用VIM編輯器編寫一個程序:一個進程創建(fork)兩個子進程。給出源代碼:
1 #include<sys/types.h> 2 #include<unistd.h> 3 #include<stdio.h> 4 int main() 5 { 6 pid_t fpid1; 7 pid_t fpid2; 8 fpid1 = fork(); 9 if(fpid1<0) 10 printf("error in fork!"); 11 else if(fpid1==0) 12 printf("First Child process, my process id is %d\n",getpid()); 13 else { 14 fpid2 = fork(); 15 if(fpid2<0) 16 printf("error in fork!"); 17 else if(fpid2==0) { 18 printf("Second Child process, my process id is %d\n",getpid()); 19 } 20 else { 21 printf("Parent process, my process id is %d\n",getpid()); 22 } 23 } 24 sleep(100); 25 return 0; 26 }
2. 打印進程樹
打印1所創建的進程樹結構,給出帶有自己名字的截圖。
提示:
- 使用
unsigned sleep(unsigned seconds)
掛起進程,以便打印進程樹 - 打印進程樹命令
pstree -p pid
編譯程序並運行:
打印進程樹:
3. 解讀進程相關信息
(2) ps -ef
使用ps -ef
給出所創建進程的信息,並分析每個字段的含義。
字段含義:
UID:用戶ID(此處為lvyuhua)
PID:進程ID(此處為27672、27673、27674等)
PPID:該進程的父進程ID(例如子進程27673、27674對應其父進程27672)
C:該進程占用CPU的百分比(此處為0)
STIME:進程開始時間(此處為23:36)
TTY:終端的次要裝置號碼(此處為pts/2)
TIME:進程運行時間(此處為00:00:00)
CMD:所執行的指令(此處為 ./fork)
(2) ps -aux
使用ps -aux
給出所創建進程的信息,並分析每個字段的含義。
字段含義:
USER:用戶名(此處為lvyuhua)
PID:進程ID(此處為27672、27673、27674等)
%CPU:占用的 CPU 使用率(0.0)
%MEN:占用的記憶體使用率(0.0)
VSZ:占用的虛擬記憶體大小(kb)
RSS:占用記憶體的大小(kb)
TTY:終端的次要裝置號碼(此處為pts/2)
STAT:進程狀態(此處S表示中斷,R表示運行,+ 位於后台的進程組)
該行程的狀態,linux的進程有5種狀態:
– D 不可中斷 uninterruptible sleep (usually IO)
– R 運行 runnable (on run queue)
– S 中斷 sleeping
– T 停止 traced or stopped
– Z 僵死 a defunct (”zombie”)
START:進程開始時間(此處為23:36)
TIME:執行的時間(此處為0:00)
COMMAND:所執行的指令(此處為 ./fork)
4. 通過該實驗產生新的疑問及解答
1.編寫c程序的時候沒有理解好fork()的工作方式。
直接在第一個子進程中執行fork()創建子進程,導致第二個進程的父進程變成了第一個子進程。把第二個fork()放到else里面就成功了。