版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
實(shí)驗(yàn)六:進(jìn)程間通信實(shí)驗(yàn)?zāi)康模簩W(xué)會(huì)進(jìn)程間通信方式:無(wú)名管道,有名管道,信號(hào),消息隊(duì)列,?實(shí)驗(yàn)要求:(一) 在父進(jìn)程中創(chuàng)建一無(wú)名管道,并創(chuàng)建子進(jìn)程來(lái)讀該管道,父進(jìn)程來(lái)寫(xiě)該管道(二) 在進(jìn)程中為SIGBUS注冊(cè)處理函數(shù),并向該進(jìn)程發(fā)送SIGBUS信號(hào)(三) 創(chuàng)建一消息隊(duì)列,實(shí)現(xiàn)向隊(duì)列中存放數(shù)據(jù)和讀取數(shù)據(jù)?實(shí)驗(yàn)器材:軟件:安裝了Linux的vmware虛擬機(jī)硬件:PC機(jī)一臺(tái)實(shí)驗(yàn)步驟:(一)無(wú)名管道的使用1、編寫(xiě)實(shí)驗(yàn)代碼pipenv.c#include<unistd.h>#include<svs/tvpes.h>#include<errno.h>#include<stdio.h>#include<string.h>#include<stdlib.h>iiitmam()mtpipe.fd[2];//管道返回讀寫(xiě)文件描述符pid_tpid;chai-bufLi[100];chai*p_wbuf;intr_num;meniset(bufLi;0,sizeof(bufLr))^/^buf_r初始化chaistrl[]=^paientwrite1"holle””;charstr2[]="paientwiite2"pipe”\n”;r_num=30;/*創(chuàng)建管道*7if(pipe(pipe_fd)<O)piiiitf(npipecreateenor\iiH);return-1;嚴(yán)創(chuàng)建子進(jìn)程可if((pid=fork())==0)〃子進(jìn)程執(zhí)行代碼〃1、子進(jìn)程先關(guān)閉了管道的寫(xiě)端close(pipe_fd[l]);〃2、讓父進(jìn)程先運(yùn)行,這樣父進(jìn)程先寫(xiě)子進(jìn)程才有內(nèi)容讀sleep⑵;〃3、讀取管道的讀端,并輸出數(shù)據(jù)if(iead(pipe_fcl[0].buf.^i_num)<0)printf(4<readerrorexit(-l);}pmitf(“%s\n”,bufLQ;〃4、關(guān)閉管道的讀端,并退出close(pipe_fd[l]);}elseif(pid>0)//父進(jìn)程執(zhí)行代碼{〃1、父進(jìn)程先關(guān)閉了管道的讀端close(pipe_fd[0]);〃2、向管道寫(xiě)入字符串?dāng)?shù)據(jù)p_wbuf=&strl;wnte(pipe_fd[1],p_wbuf,sizof(p_wbuf));p_wbuf=&str2;wnte(pipe_fd[1],p_wbuf,sizof(p_wbuf));〃3、關(guān)閉寫(xiě)端,并等待子進(jìn)程結(jié)束后退出clos亡(pipe_fd[l]);}retuin0;#include<unistd.h>#include<svs/tvpes.h>#include<errno.h>#include<stdio.h>#include<string.h>#include<stdlib.h>iiitmam()mtpipe.fd[2];//管道返回讀寫(xiě)文件描述符pid_tpid;chai-bun(100];chai*p_wbuf;intinum:mems戰(zhàn)(bi】fLi\0、sizeof(bi】fL[))〃|§buf_r初始化chaistrl[]=HhoUeM;chai-str2[]=HpipeH;i_num=10;/*創(chuàng)建管道*/if(pipe(pipe_fci)<0){piiiitf(npipecreateenor\iiH);return-1;}/*創(chuàng)建子進(jìn)程*/if((pid=fork())==0)〃子進(jìn)程執(zhí)行代碼{close(pipe_fd[l]);//l、子進(jìn)程先關(guān)閉了管道的寫(xiě)端〃2、讓父進(jìn)程先運(yùn)行,這樣父進(jìn)程先寫(xiě)子進(jìn)程才有內(nèi)容讀〃3、讀取管道的讀端,并輸出數(shù)據(jù)if(read(pipe_fd[O],buf_r,i_num)<0){pimtf("read1error!");exit(-l);}pnntf("\iipaieiitwrite1%s!",buJ);sleep(l);if(read(pipe_fd[0],buf_r,i_num)<0){pimtf("read2error!");exit(-l);}pnntf("\iipaieiitwrite2%s!H,buf_i);close(pipe_fd[l]);//4、關(guān)閉管道的讀端,并退出exit(l);//pnntfCchilderrorr*);}elseif(pid>0)//父進(jìn)程執(zhí)行代碼{close(pipe_fd[0]);//l、父進(jìn)程先關(guān)閉了管道的讀端pwbuf=sul;//2.向管道寫(xiě)入字符串?dāng)?shù)據(jù)write(pipe_fd[1].p_wbufsizeof(strl));sleep(l);p_wbuf=str2;write(pipe_fd[1].p_wbufsizeof(str2));close(pipe_fd[l]);//3.關(guān)閉寫(xiě)端,并等待子進(jìn)程結(jié)束后退出exit(l);//printf(Hfathei-error!H);}return0;}jvcvcc^ubuntu:*$gcctest.c-otestjvcvcc^ubuntu:**$?/testjvcvcc^ubuntu:-$parentwritelhollelpoirentwrite2pipe;|2、 編譯應(yīng)用程序pipe_nv.c[root@localhostpipe]#Ispipe_rw?c[root@localhostpipe]#gccpipe_rw.c-opipe_rw3、 運(yùn)行應(yīng)用程序[root@localhostpipe]#?/pipe_rwparenl:writelHello!parenl:write2Pipe!10numbersreadfromth£pipeisHelloPipe子進(jìn)程先睡兩秒讓父進(jìn)程先運(yùn)行,父進(jìn)程冠兩次寫(xiě)入“hello”和“pipe”,然后阻塞等待子進(jìn)程退出,子進(jìn)程醒來(lái)后讀出管道里的內(nèi)容并打印到屏幕上再退出,父進(jìn)程捕獲到子進(jìn)程退出后也退出4、 由于fork函數(shù)讓子進(jìn)程完整地拷貝了父進(jìn)程的整個(gè)地址空間,所以父子進(jìn)程都有管道的讀端和寫(xiě)端。我們往往希望父子進(jìn)程中的一個(gè)進(jìn)程寫(xiě)一個(gè)進(jìn)程讀,那么寫(xiě)的進(jìn)程最后關(guān)掉讀端,讀的進(jìn)程最好關(guān)閉掉寫(xiě)端(二)信號(hào)處理1、編寫(xiě)實(shí)驗(yàn)代碼sig_bus.c#include<signal.h>#include<stdio.h>#include<stdlib.h>〃1、自定義信號(hào)處理函數(shù),處理SIGBUS信號(hào),打印捕捉到信號(hào)即可staticvoidsignaLhandler(iiitsigno){if(signo==SIGEUS)printff'XiiIhavegetSIGEUS”);exit(EXIT_FAILURE);}iiitmain(){piintf(MWaitmgforsignalSIGBUS\ii”);〃2、注冊(cè)信號(hào)處理函數(shù)if(signal(SIGBUS,signaLhandler)=SIG_ERR){fpimtf^stden/^caiuiothandleSIGEUSVn”);exit(EXIT_FAILURE);}pause。;//將進(jìn)程掛起直到捕捉到信號(hào)為止exit(O);return0;}嚴(yán)*******************************#include<signal.h>#include<stdio.h>#include<stdlib.h>#include<unistd.h>Hi.自定義信號(hào)處理函數(shù),處理SIGBUS信號(hào),打印捕捉到信號(hào)即可staticvoidsignaLhandlei(mtsigno){if(signo==SIGEUS)pnntf(MIhavegetSIGBUSM);exit(EXIT_FAILURE);}iiitmain(){piintf(MWaitmgforsignalSIGBUS\ii”);〃2、注冊(cè)信號(hào)處理函數(shù)if(signal(SIGBUS,signaLhandler)=SIGERR)
fprmtf(stden\''cannothandleSIGEUS\n”);exit(EXIT_FAILURE);}pause。;//將進(jìn)程掛起直到捕捉到信號(hào)為止exit(O);return0;jvcvcc@ubuntu:~$psaux|greptestjvcvcc@ubuntu:~$psaux|greptestjvcvcc 240032.25?£63242455624vcvcc/Lest.cjvcvcc 422214224692jVCVCC 4Z6000.0O.Z111802028autotestjvcvcc@ubuntu:-$kill-BUS42221jvcvcc@ubuntu:~$D***************************/?SI05:112:45gedit/home/jPts/1S+07:110:00./testPtS/17s+07:140:00grep--color=X—口TerminalFileEditViewSearchTerminalHelpjvcvcc@ubuntu:-$gcctest.c-otestjvcvcc@ubuntu:-$?/testWaitingforsignalSIGBUSIhavegetSICBUSjvcvcc@ubuntu:-$|用signal系統(tǒng)調(diào)用為SIGBUS信號(hào)注冊(cè)信號(hào)處理函數(shù)my_hmc,然后將進(jìn)程掛起等待SIGBUS信號(hào)。所以需要向該進(jìn)程發(fā)送SIGBUS信號(hào)才會(huì)執(zhí)行自定義的信號(hào)處理函數(shù)2、編譯應(yīng)用程序sig^bus.c[root@lo8lhostpipe]#gccsigbus.c?osig_bus3、運(yùn)行應(yīng)用程序先先一個(gè)終端中運(yùn)行sijbus,會(huì)看到進(jìn)程掛起,等待信號(hào)[root(alocalhostpipe]#?/sigbusWaitingforsignalSIGBUS然后在另一個(gè)終端中,查找到運(yùn)行sijbus這個(gè)產(chǎn)生的進(jìn)程號(hào),用kill命令發(fā)送SIGBUS信號(hào)給這個(gè)進(jìn)程[root(aiocalhosttcpclient]#ps?aux|grepsigbusWarning:rootroottax,perhapsabogus0.20.0 1508 3160.00.0 3908 664Warning:rootroottax,perhapsabogus0.20.0 1508 3160.00.0 3908 664[root@localhosttcpclient]#kill-BUS-'?See/usr/share/doc/procps-3.2.7/FAQpts/3 S+ 01:00 0:00./sigbuspts/2 R+ 01:00 0:00grepsigbus18966rroot(aiocalhosttcoclientl#我們可以看到前而掛起的進(jìn)程在接收到這個(gè)信號(hào)后的處理[rootcalocalhostpipe]#?/sigbusWaitingforsignalSIGBUSIhavegetSIGBUS[root(alocalhostpipe]#用自定義信號(hào)處理函數(shù)mv_fiinc來(lái)處理,所以打印了IhavegetSIGBUS這樣一句話?上機(jī)報(bào)告要求:1、總結(jié)pipe(),signalQ的函數(shù)定義原型,返回值和參數(shù)的意義表頭文件:^include定義函數(shù):intpipe(intfiledes[2]);函數(shù)說(shuō)明(參數(shù)):pipeQ會(huì)建立管道,并將文件描述詞由參數(shù)filedes數(shù)組返回。filedes[0]為管道里的讀取端,filedes[l]則為管道的寫(xiě)入端。返回值:若成功則返回零,否則返回-1,錯(cuò)誤原因存于emio中。阻塞問(wèn)題:當(dāng)管道中的數(shù)據(jù)被讀取后,管道為空。一個(gè)隨后的“ad。調(diào)用將默認(rèn)的被阻塞,等待某些數(shù)據(jù)寫(xiě)入。功能:管道是一種把兩個(gè)進(jìn)程之間的標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出連接起來(lái)的機(jī)制,從而提供一種讓多個(gè)進(jìn)程間通信的方法,當(dāng)進(jìn)程創(chuàng)建管道時(shí),每次都需要提供兩個(gè)文件描述符來(lái)操作管道。其中一個(gè)對(duì)管道進(jìn)行寫(xiě)操作,另一個(gè)對(duì)管道進(jìn)行讀操作。對(duì)管道的讀寫(xiě)與一般的IO系統(tǒng)函數(shù)一致,使用wnte()函數(shù)寫(xiě)入數(shù)據(jù),使用read()讀出數(shù)據(jù)。表頭文件:#iiiclude<signal.h>功能:設(shè)置某一信號(hào)的對(duì)應(yīng)動(dòng)作函數(shù)原型:void(*signal(intsignum,void(*handler)(iiit)))(iiit);或者:typedefvoid(*sig_t)(int); signal(intsignum,sig_4handler)^_^可看成是signal。函數(shù)(它自己是帶有兩個(gè)參如二個(gè)為整型,一個(gè)為函數(shù)指針的函數(shù)),而這個(gè)signalO函數(shù)的返回值也為一個(gè)函數(shù)指針,這個(gè)函數(shù)指針指向一個(gè)帶整型參數(shù),并且返回值為void的一個(gè)函數(shù)。參數(shù)說(shuō)明:第一個(gè)參數(shù)signum指明了所要處理的信號(hào)類型,它可以取除了SIGKILL和SIGSTOP外的任何一種信號(hào)。第二個(gè)參數(shù)handler描述了與信號(hào)關(guān)聯(lián)的動(dòng)作,它可以取以卞三種值:一個(gè)返回值為正數(shù)的函數(shù)地址此函數(shù)必須在sigiial()被調(diào)用前申明,handler中為這個(gè)函數(shù)的名字。當(dāng)接收到一個(gè)類型為sig的信號(hào)時(shí),就執(zhí)行handler所指定的函數(shù)。這個(gè)函數(shù)應(yīng)有如下形式的定義:intfiinc(iiitsig); sig是傳遞給它的唯一參數(shù)。執(zhí)行了signal()調(diào)用后,進(jìn)程只要接收到類型為sig的信號(hào),不管其正在執(zhí)行程序的哪一部分,就立即執(zhí)行ftincO函數(shù)。當(dāng)ftincQ函數(shù)執(zhí)行結(jié)束后,控制權(quán)返回進(jìn)程被中斷的那一點(diǎn)繼續(xù)執(zhí)行。SIGIGN這個(gè)符號(hào)表示忽略該信號(hào),執(zhí)行了相應(yīng)的signalQ調(diào)用后,進(jìn)程會(huì)忽略類型為sig的信號(hào)。SIGDFL這個(gè)符號(hào)表示恢復(fù)系統(tǒng)對(duì)信號(hào)的默認(rèn)處理。函數(shù)說(shuō)明:signalQ會(huì)依參數(shù)signum指定的信號(hào)編號(hào)來(lái)設(shè)置該信號(hào)的處理函數(shù)。當(dāng)指定的信號(hào)到達(dá)時(shí)就會(huì)跳轉(zhuǎn)到參數(shù)handler指定的函數(shù)執(zhí)行。當(dāng)一個(gè)信號(hào)的信號(hào)處理函數(shù)執(zhí)行時(shí),如果進(jìn)程又接收到了該信號(hào),該信號(hào)會(huì)自動(dòng)被儲(chǔ)存而不會(huì)中斷信號(hào)處理函數(shù)的執(zhí)行,直到信號(hào)處理函數(shù)執(zhí)行完畢再重新調(diào)用相應(yīng)的處理函數(shù)。但是如杲在信號(hào)處理函數(shù)執(zhí)行時(shí)進(jìn)程收到了其它類型的信號(hào),該函數(shù)的執(zhí)行就會(huì)被中斷。返回值:返回先前的信號(hào)處理函數(shù)指針,如果有錯(cuò)誤則返回SIG_ERR(-1)O附加說(shuō)明:在信號(hào)發(fā)生跳轉(zhuǎn)到自定的handler處理函數(shù)執(zhí)行后,系統(tǒng)會(huì)自動(dòng)將此處理函數(shù)換回原來(lái)系統(tǒng)預(yù)設(shè)的處理方式,如果要改變此操作請(qǐng)改用sigactionQo下面的情況可以產(chǎn)生Signal:按下CTRL+C產(chǎn)生SIGINT碩件中斷,如除0,非法內(nèi)存訪問(wèn)(SIGSEV)等等Kill函數(shù)可以對(duì)進(jìn)程發(fā)送SignalKill命令。實(shí)際上是對(duì)Kill函數(shù)的一個(gè)包裝5?軟件中斷。如當(dāng)AlarmClock超時(shí)(SIGURG),當(dāng)Reader中止之后又向管道寫(xiě)數(shù)據(jù)(SIGPIPE)命名管道FIFO功能:管道最大的劣勢(shì)就是沒(méi)有名字,只能用于有一個(gè)共同祖先進(jìn)程的各個(gè)進(jìn)程之間°FIFO代表先進(jìn)先出,單它是一個(gè)單向數(shù)據(jù)流,也就是半雙工,和管道不同的是:每個(gè)FIFO都有一個(gè)路徑與之關(guān)聯(lián),從而允許無(wú)親緣關(guān)系的進(jìn)程訪問(wèn)。頭文件:#include<sys/tvpes.h>存include<sys/stat.h>函數(shù)定義原型:mtmkfifd(constchai*pathiiaine,modestmode);參數(shù):這里patluiaine是路徑名jnod亡是svs/stat.h里面定義的創(chuàng)建文件的權(quán)限.2、利用有名管道FIFO實(shí)現(xiàn)類似第一個(gè)實(shí)驗(yàn)的功能,一個(gè)程序fifo.read.c寫(xiě)數(shù)據(jù)”HiLinux”,另一個(gè)程序fifo_write.c讀數(shù)據(jù)并打印出來(lái)。//fifo.read.c#include<unistd.h>#include<svs/types.h>#include<svs/stat.h>#include<fcntl.h>#include<errno.h>#include<stdio.h>#include<string.h>#include<st
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 豬小弟課件教學(xué)課件
- 2024年廣西體育館大院體育用品銷售合同
- 2024年建筑工程分包及勞務(wù)承包協(xié)議
- 2024年度石油天然氣開(kāi)采與銷售合同
- 2024年度船舶修造安裝工程分包協(xié)議
- 2024年度深圳晚輔老師招聘合同
- 2024年布匹交易協(xié)議規(guī)定
- 04年國(guó)際貨物買(mǎi)賣(mài)合同
- 2024期房購(gòu)買(mǎi)合同范本
- 2024年度施工現(xiàn)場(chǎng)食品安全管理合同
- 園區(qū)出入管理系統(tǒng)施工方案
- 數(shù)據(jù)可視化說(shuō)課 高中信息技術(shù)
- 混凝土結(jié)構(gòu)施工圖平面整體表示方法制圖規(guī)則和詳圖
- 2024年二季度靈活就業(yè)調(diào)查報(bào)告
- 中華民族現(xiàn)代文明有哪些鮮明特質(zhì)?建設(shè)中華民族現(xiàn)代文明的路徑是什么?參考答案三
- 液壓站操作說(shuō)明書(shū)
- 2021至2024年廣東新高考化學(xué)真題考點(diǎn)分布試題及答案
- 7《小書(shū)包》教學(xué)設(shè)計(jì)-2024-2025學(xué)年統(tǒng)編版語(yǔ)文一年級(jí)上冊(cè)
- 廣安市岳池縣2024年上半年“小平故里英才”引進(jìn)急需緊缺專業(yè)人才歷年(高頻重點(diǎn)復(fù)習(xí)提升訓(xùn)練)共500題附帶答案詳解
- 走進(jìn)攝影智慧樹(shù)知到答案2024年海南軟件職業(yè)技術(shù)學(xué)院
- 2024年人教版五年級(jí)上冊(cè)數(shù)學(xué)第五單元課后練習(xí)題(含答案和概念)
評(píng)論
0/150
提交評(píng)論