linux进程管理命令实验,实验2Linux进程管理.doc
實驗2Linux進程管理
實驗2 Linux進程管理
實驗目的
1、加深對進程概念的理解,明確進程和程序的區別
2、進一步認識并發執行的實質
3、分析進程爭用資源的現象,學習解決進程互斥的方法
實驗性質
驗證性實驗,必做,3課時
預習與實驗要求
1、閱讀Linux的sched.h源碼文件,加深對進程概念的理解
2、閱讀Linux的fork.c源碼文件,分析進程的創建過程
要用到的系統調用
1、int fork 創建一個新進程
頭文件:#include #include 返回值的意義:0,創建子進程,從子進程返回的id值 -1,創建失敗 大于0,從父進程返回的子進程id值
2、lockf files, function, size 鎖定/解鎖文件或文件的某段
該函數的頭文件為:#include
參數定義:int lockf int files, int function, long size
含義:files是文件描述符;
function為1(常量F_LOCK)表示互斥鎖定,為0(常量F_ULOCK)表示解鎖;
size是鎖定或解鎖的字節數,若用0,表示從文件的當前位置到文件尾。
實驗內容
創建進程。
輸入并運行下面的程序。思考為什么會輸出兩行信息。【建議用emacs或gedit編輯】
int main int pid;
pid fork ;
switch pid case -1: printf "fail to create process\n" ; return 1;
case 0: //對于子進程來講,變量pid的值為0 printf "I'm son, my pid is %d, my father's pid is %d\n", getpid , getppid ; break;
default: //對于父進程來講,pid記錄了返回的子進程的ID,必然大于0 printf "I'm father, my pid is %d, my son's pid is %d\n", getpid , pid ; return 0; 輸出結果并非是一行,而是2行。比如,結果可能是:
I'm son, my pid is 1860, my father's pid is 1859
I'm father, my pid is 1859, my son's pid is 1860
解釋:
fork函數被調用一次但返回兩次。兩次返回的唯一區別:子進程中返回0值,父進程中返回子進程ID。
為什么返回兩次?原因:linux將父進程的地址空間、數據空間、堆、棧等資源復制一份給子進程,子進程是父進程的副本,只有代碼段是共享的。注意:由于在復制時復制了父進程的堆棧段,所以兩個進程都停留在fork函數中,等待返回。不同的是,fork 返回給父進程的是新建子進程的ID,返回給子進程的是0。
如果對“返回”還難以理解,想一下學C語言時候的函數調用。函數調用時,將返回地址入棧,再將實參入棧。被調函數從棧中取出參數,賦值給形參,執行完后,取出返回地址,跳回去繼續執行。
1、驗證進程并發執行
編寫一段程序,使用系統調用fork 創建兩個子進程。當此程序運行時,在系統中有一個父進程和兩個子進程活動。讓每個進程在屏幕上顯示一個字符串:父進程顯示“parent is working”;兩個子進程分別顯示“son is working”和“daughter is working”。多運行幾次該程序,觀察屏幕上的顯示結果,并分析原因。
文件名為a21.c
#include
main int p1,p2;
while p1 fork -1 ;/*創建子進程,將其ID號給p1,直到成功*/
if p1 0 printf “son is working\n” ;/*子進程返回的p1才為0,說明此時子進程執行*/
else /*p1 0,說明此p1是父進程函數調用返回的子進程的ID號*/
while p2 fork -1 ;/*創建子進程p2,將其ID號給p2,直到成功*/
if p2 0 printf “dauthter is working” ; /*子進程p2執行*/
else printf “parent” ; /*父進程執行*/ printf “share\n” ;/*3個進程共享的語句*/ 執行:用gcc a21.c –o a21.out編譯,產生a21.out文件。在終端里輸入./a21.out,并回車執行。看結果。再按向上箭頭,并回車重復執行。看結果。如此多執行幾次。
分析:可以認為,父進程和兩個子進程有相同的代碼。相當于,上述程序有3份在內存。它們并發執行,但它們返回的
總結
以上是生活随笔為你收集整理的linux进程管理命令实验,实验2Linux进程管理.doc的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle错误代码12516,ORA-
- 下一篇: linux比较两个文件md5,linux