作業系統第二次實驗

2021-09-12 20:25:03 字數 2969 閱讀 1416

​ 16281049 王晗煒 計科1601

實驗題目

開啟乙個vi程序。通過ps命令以及選擇合適的引數,只顯示名字為vi的程序。尋找vi程序的父程序,直到init程序為止。記錄過程中所有程序的id和父程序id。將得到的程序樹和由pstree命令的得到的程序樹進行比較。

根據其父程序繼續查詢,直到找到程序init:

如圖所示程序1便是我們要找到了init程序,至此查詢結束。

使用pstree查詢

二者比較

使用ps命令查詢是從當前程序一步步尋找父程序,是乙個自底向上的過程,而pstree指令與之相反,是乙個自頂向下的過程,前者查詢的資訊較為全面且精確,但需要操作的步數較多,而後者給出的資訊雖然較少,但結構一目了然,不過在子程序較多的情況下尋找所需資訊也較為複雜。因此這兩種方法應結合實際情況具體分析選擇使用。

編寫程式,首先使用fork系統呼叫,建立子程序。在父程序中繼續執行空迴圈操作;在子程序中呼叫exec開啟vi編輯器。然後在另外乙個終端中,通過ps –al命令、ps aux或者top等命令,檢視vi程序及其父程序的執行狀態,理解每個引數所表達的意義。選擇合適的命令引數,對所有程序按照cpu佔用率排序。

由此我們可以知道父程序正在執行狀態,而子程序處於休眠狀態,所以兩個程序相對的cpu佔用率父程序為100%,要高於子程序。

使用fork系統呼叫,建立如下程序樹,並使每個程序輸出自己的id和父程序的id。觀察程序的執行順序和執行狀態的變化。

修改上述程序樹中的程序,使得所有程序都迴圈輸出自己的id和父程序的id。然後終止p2程序(分別採用kill -9 、自己正常退出exit()、段錯誤退出),觀察p1、p3、p4、p5程序的執行狀態和其他相關引數有何改變。

#include

#include

#include

intmain()

}elseif(

!pid)

}else

if(pid ==-1

) perror (

"fork");

return0;

}

在終端上使用gcc編譯並執行:

隨後首先使用kill -9命令終止p2程序:

可見kill程序執行後程序號仍然保留,而子程序則如上題一樣被upstrat收養。

在linux中kill和kill -9,兩個命令在linux中都有殺死程序的效果,執行kill命令,系統會傳送乙個sigterm訊號給對應的程式。當程式接收到該signal訊號後,將會發生以下事情:

大部分程式接收到sigterm訊號後,會先釋放自己的資源,然後再停止。但是也有程式可能接收訊號後,做一些其他的事情,也就是說sigterm多半是會被阻塞的。

然而kill -9命令,系統給對應程式傳送的訊號是sigkill,即exit。exit訊號不會被系統阻塞,所以kill -9能順利殺掉程序。基於此猜測執行exit程序後的結果和kill -9一樣。

使用exit終止p2程序

因為exit只能在源程式中呼叫,這裡對原先的程式做了一些修改,**如下:

#include

#include

#include

#include

intmain()

}elseif(

!pid)

while(1

)}else

if(pid ==-1

) perror (

"fork");

return0;

}

之後再次編譯執行:

之後再觀察其列印結果:

使用段錯誤終止p2程序

這裡段錯誤引發仍需在程式中進行改動,這裡直接構造乙個野指標造成乙個記憶體訪問錯誤從而實現段錯誤,**改動如下:

#include

#include

#include

#include

intmain()

}elseif(

!pid)

}while(1

)}else

if(pid ==-1

) perror (

"fork");

return0;

}

再次編譯並執行:

首次列印一切正常,等待10s過後觀察再次列印的結果:

可見結果也和前兩次一樣,至此我們可以得出結論這三種結束程序的方式都不會終止子程序,而是將其變為孤兒程序最後被upstart收養。

附:實驗源**

作業系統第二次實驗 建立程序

個人資訊 姓名 張越 班級 計算1811 學號 201821121006 1.編寫程式 include2 include3 include4 intmain 5 13if pid 0 16else if pid 0 19else 22 sleep 1000 延遲 23 return 0 2.列印程序...

第二次實驗

一 問題及 問題提 乙個數如果恰好等於它的因子之和,這個數就稱為 完數 例如6 1 2 3,再如8的因子和是7 即1 2 4 8不是完數。程式設計找出1000以內的所有完數。答案 6 28 496 檔名稱 作 者 周玉傑 完成日期 2017 年 3月 13 日 版 本 號 dev c 對任務及求解方...

第二次實驗

1 如何進行模式切換 哪兩種模式 答 第一次啟動linux系統會進入命令列模式,會要求輸入使用者名稱,預設的管理員帳號名為root,輸入 root 後回車,提示輸入密碼 密碼是在安裝系統時自己設定的 這樣就以管理員身份登陸了系統。第二種就是如果不想用使用命令列模式,而需要進入圖形介面 在命令列模式下...