實(shí)驗(yàn)三linux進(jìn)程信號(hào)通信

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