《實驗三linux進程信號通信》由會員分享,可在線閱讀,更多相關(guān)《實驗三linux進程信號通信(12頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、單擊此處編輯母版標(biāo)題樣式,,單擊此處編輯母版文本樣式,,第二級,,第三級,,第四級,,第五級,,,,*,,,單擊此處編輯母版標(biāo)題樣式,,單擊此處編輯母版文本樣式,,第二級,,第三級,,第四級,,第五級,,,,*,實驗三,linux,進程信號通信,一、實驗?zāi)康?了解,linux,中的信號,熟悉,linux,系統(tǒng)中進程之間軟中斷信號的基本原理。,二、實驗內(nèi)容,1,、編寫程序:用,fork(),創(chuàng)建兩個子進程,再用系統(tǒng)調(diào)用,signal(),讓父進程捕捉鍵盤上來的中斷信號(按,^c,鍵);捕捉到中斷信號后,父進程用系統(tǒng)調(diào)用,kill(),向兩個子進程發(fā)出信號,子進程捕捉到信號后分別輸出下列信息,然后
2、終止:,,,child process1 is killed by parent!,,child process2 is killed by parent!,,父進程等待兩個子進程終止后,輸出如下的信息后終止:,,parent process is killed!,,2.,分析利用軟中斷通信實現(xiàn)進程同步的機制。,,3,、寫出例,2,中的實驗結(jié)果,并作適當(dāng)?shù)姆治觥?三、實驗指導(dǎo),1,、,kill(),系統(tǒng)調(diào)用,,系統(tǒng)調(diào)用格式:,int kill(pid,sig),,參數(shù)定義:,int pid,sig;,,其中,,pid,是一個或一組進程的標(biāo)識符,參數(shù),sig,是要發(fā)送的軟中斷信號。,,(,1,)
3、,pid>0,時,核心將信號發(fā)送給進程,pid.,,(2)pid=0,時,核心將信號發(fā)送給與發(fā)送進程同組的所有進程。,,(,3,),pid=-1,時,核心將信號發(fā)送給所有用戶標(biāo)識符真正等于發(fā)送進程的有效用戶標(biāo)識號的進程。,2,。,signal(),系統(tǒng)調(diào)用,,預(yù)置對信號的處理方式,允許調(diào)用進程控制軟中斷信號。,,系統(tǒng)調(diào)用格式:,,signal(sig,function),,參數(shù)定義:,,signal(sig,function),,int sig;,,void(*func)();,,其中,,sig,用于指定信號的類型,,sig,為,0,則表示沒有收到任何信號,余者如下表所示:,,值,名字,說明,
4、01,SIGHUP,掛起(,hangup),02,SIGINT,中斷,當(dāng)用戶從鍵盤按,^c,時,03,SIGQUIT,退出,當(dāng)用戶從鍵盤按,quit,鍵時,04,SIGILL,非法指令,05,SIGTRAP,跟蹤陷阱,啟動進程,跟蹤代碼的執(zhí)行。,06,SIGIOT,IOT,指令,06,SIGEMT,EMT,指令,07,SIGFPE,浮點運算溢出,08,SIGKILL,殺死。終止進程,。。。,,,16,SIGUSR1,用戶自定義信號,1,17,SIGUSR2,用戶自定義信號,2,,18,SIGCLD,某個子進程死,19,SIGPWR,電源故障,function:,在該進程中的一個函數(shù)地址,,,在
5、核心態(tài)返回用戶態(tài)時,,,它以軟中斷信號的序號作為參數(shù)調(diào)用該函數(shù),,,對除了信號,sigkill,sigtrap,sigpwr,以外的信號,,,核心自動地重新設(shè)置軟中斷信號處理程序的值為,SIG_DFL,,一個進程不能捕獲,SIGKILL,信號,.,,,function,解釋如下,:,,(1)function=1,時,,,進程對,sig,類信號不理睬,,,即屏蔽了該類信號,;,,,(2)function=0,時,,,缺省值,,,進程在收到,sig,信號后應(yīng)終止自已,;,,,(1)function,為非,0,,非,1,類整數(shù)時,,function,的值即作為信號處理程序的指針,.,3.lockf(
6、),系統(tǒng)調(diào)用,,用作鎖定文件的某些段或者整個文件,.,,系統(tǒng)調(diào)用格式,:lockf(files,function,size),,參數(shù)定義,:,,int lockf(files,function,size),,int files,function;,,long size;,,其中,:files,是文件描述符,;function,是鎖定和解鎖,;1,表鎖定,,0,表解鎖,.size,是鎖定或解鎖的字節(jié)數(shù),,,為,0,,表示從文件的當(dāng)前位置到文件尾,.,5,、參考程序(例,1,),#include,,#include,,#include,,void waiting (),stop();,,int w
7、ait_mark;,,main(),,{,,int p1,p2,stdout;,,signal(SIGINT,stop); /*,接收到,^c,信號,,,轉(zhuǎn),stop*/,,while((p1=fork())==-1); /*,創(chuàng)建子進程,P1*/,,if(p1>0),,{,,while((p2=fork())==-1); /*,創(chuàng)建子進程,p2*/,,if(p2>0),,{,,wait_mark=1;,,sleep(5); /*,接收到,^c,信號,,,轉(zhuǎn),stop*/,,waiting();,kill(p1,16); /*,向,p1,發(fā)軟中斷信號,16*/,,kill(p
8、2,17); /*,向,p2,發(fā)軟中斷信號,17*/,,wait(0); /*,同步*,/,,wait(0);,,printf("parent process is killed!\n");,,exit(0);,,},,,else,,{,,wait_mark=1;,,signal(17,stop); /*,接收到軟中斷信號,17,,轉(zhuǎn),stop*/,,waiting();,,lockf(stdout,1,0);,,printf("child process 2 is killed by parent!\n");,,lockf(stdout,0,0);,,exit(0);,
9、,},,},else,,{,,wait_mark=1;,,signal(16,stop); /*,接收到軟中斷信號,16,,轉(zhuǎn),stop*/,,waiting();,,lockf(stdout,1,0);,,printf("child process 1 is killed by parent!\n");,,lockf(stdout,0,0);,,exit(0);,,},,},,void waiting(),,{ while (wait_mark!=0); },,void stop(),,{ wait_mark=0; },另一個信號機構(gòu)方法的例子:(例,2,),#include
10、,,#include,,main(),,{int status;,,pid_t pid;,,void func();,,signal(SIGUSR1,func);,,If(pid=fork()),,{ printf("parent:will send signal.\n");,,kill(pid,SIGUSR1);,,wait(,,printf(“status=%d: parent finished.\n“,status);},,else,,{sleep(10);,,printf("child :signal is received.\n");,,exit(0);},,},,void func(),,{printf(“it is signal processing function.\n");},,,,,問:此例屏幕上顯示的結(jié)果是什么?為什么?,