作業系統第2次實驗報告:創建進程
- 2020 年 4 月 3 日
- 筆記
零、個人資訊
- 姓名:陳韻
- 學號: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:該進程目前的狀態。這裡列舉出主要的狀態如下:
- R:run該程式目前正在運作,或位於隊列中
- S:sleep該程式目前正在睡眠中
- T:track or stop該程式目前正停止或者被追蹤
- Z:zombie該進程已終止,但是其父進程沒有將其回收,導致其成為殭屍進程
- START:進程啟動的時間
- TIME:進程實際使用CPU的時間
- COMMAND:所下達的命令名稱,這裡運行了文件cy: ./cy
四. 通過該實驗產生新的疑問及解答
1、在VIM編輯程式碼沒有提示功能很難受,因此我試圖自己用編輯器編寫完cpp程式碼再拷貝到VIM里,但格式錯亂。
可以在VIM中運行命令set paste,當下面的INSERT後跟著(paste),表明進入粘貼模式
2、我如何快速查看我所創建的進程的相關資訊?
在ps命令後利用管道與grep命令,快速篩選出匹配的資訊。
3、當我調用ps命令時,即使利用了快速匹配搜索,也無法找到我所創建的進程的相關資訊。
我盲猜是進程被掛起的時間太短導致我在試圖輸出進程資訊時,進程終止了。審查源程式碼時發現果不其然,當我把sleep函數的時間設置得更長後,我成功輸出了進程的相關資訊。

