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


  • 姓名:呂煜華
  • 學號: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里面就成功了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM