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