下載本文檔
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、實(shí)驗(yàn) 7 管道通信實(shí)驗(yàn)?zāi)康模?1)加深對(duì)進(jìn)程概念的理解,明確進(jìn)程和程序的區(qū)別;進(jìn)一步認(rèn)識(shí)并發(fā)執(zhí)行的實(shí)質(zhì);( 2)了解并熟悉 Linux 系統(tǒng)中利用管道實(shí)現(xiàn)進(jìn)程通信的基本概念及方法;( 3)熟悉 Linux 提供的有關(guān)系統(tǒng)調(diào)用函數(shù) /庫(kù)函數(shù),并能使用這些函數(shù)。實(shí)驗(yàn)準(zhǔn)備及預(yù)習(xí)閱讀講義附件8-管道通信,了解 Linux 系統(tǒng)中利用管道實(shí)現(xiàn)進(jìn)程通信的基本概念及方法,熟悉 Linux 提供的有關(guān)系統(tǒng)調(diào)用函數(shù) /庫(kù)函數(shù): pipe() 、mkfifo 、close()、read()、write() 、 lockf() 。實(shí)驗(yàn)內(nèi)容1、管道可用于輸入輸出重定向,它將一個(gè)命令的輸出直接定向到另一個(gè)命令的輸入。比
2、如,當(dāng)在某個(gè)shell 程序( Bourneshell 或 C shell 等)鍵入who wc -l 后,相應(yīng) shell 程序?qū)?chuàng)建who 以及 wc 兩個(gè)進(jìn)程和這兩個(gè)進(jìn)程間的管道??紤]下面的命令行:$kill -l 顯示了當(dāng)前系統(tǒng)支持的所有信號(hào)$kill -l | grep SIGRTMIN2、函數(shù) int pipe(int fd2) 創(chuàng)建一個(gè)管道,管道兩端可分別用描述字fd0 以及 fd1 來(lái)描述。需要注意的是,管道的兩端是固定了任務(wù)的。即一端只能用于讀,由描述字fd0 表示,稱(chēng)其為管道讀端;另一端則只能用于寫(xiě),由描述字fd1 來(lái)表示,稱(chēng)其為管道寫(xiě)端。下面給出的程序使用系統(tǒng)調(diào)用pipe
3、() 建立一條管道線(xiàn),兩個(gè)子進(jìn)程p1 和 p2 分別向管道各寫(xiě)一句話(huà):child1 is sending a message! 和 child2 is sending a message! ,父進(jìn)程則從管道中讀出來(lái)自子進(jìn)程的信息,并顯示在屏幕上。請(qǐng)讀懂程序并調(diào)試運(yùn)行。#include #include main()int fd2;int pid1,pid2;char OutPipe100, InPipe100; pipe(fd);while(pid1=fork()=-1);if(pid1=0)printf( “child process1 %dn ”,getpid();lockf(fd1,1,
4、0);/* 加鎖鎖定寫(xiě)入端*/sprintf(OutPipe, “child1 is sending a message!”);write(fd1, OutPipe, 50);/* 將 buf中的 50 個(gè)字符寫(xiě)入管道 */sleep(5);/*睡眠 5秒,暫時(shí)放棄 CPU*/lockf(fd1,0,0);/* 解鎖釋放寫(xiě)入端 */exit(0);/* 結(jié)束進(jìn)程 pid1 */elsewhile(pid2=fork()=-1);if(pid2=0)printf( “child process2 %dn ”,getpid() ”);lockf(fd1,1,0);sprintf(OutPipe,
5、“child2 is sending a message!”);write(fd1, OutPipe, 50);sleep(5);lockf(fd1,0,0);exit(0);elseprintf( “parent process %dn”,getpid();wait(0);read(fd0,InPipe,50);printf( “%sn”,InPipe);wait(0);read(fd0,InPipe,50);printf( “%sn”,InPipe);exit(0);3、使用管道通信時(shí),可關(guān)閉某些不需要的讀或?qū)懨枋龇?,建立起單向的讀或?qū)懝艿溃缓笥?read 和 write 像操作文件一樣
6、去操作它。下面給出的程序中子進(jìn)程通過(guò)管道向父進(jìn)程發(fā)送數(shù)據(jù),這里子進(jìn)程只使用到管道的寫(xiě)端口fd1 、父進(jìn)程使用到了fd0 ,因此可關(guān)閉子進(jìn)程的 fd0 和父進(jìn)程的fd1 。請(qǐng)通過(guò)程序體會(huì)。#include#include#include#include#include#includeint main()char *msg=I am child process!;/* 子進(jìn)程發(fā)送的數(shù)據(jù)*/pid_t pid;char buf100;/* 用于讀取 */int pi;/* 創(chuàng)建管道時(shí)的返回值*/int fd2;/* 創(chuàng)建管道的參數(shù) */memset(buf,0,sizeof(buf);/* 設(shè)置 b
7、uf 數(shù)組全為0,需 */pi=pipe(fd);/* 要引入 #include*/if(pi0)/*parent process*/close(fd1);/* 關(guān)閉寫(xiě)管道 */sleep(2);/* 休眠一下等待數(shù)據(jù)寫(xiě)入*/if(read(fd0,buf,100)0)/*寫(xiě)入管道 */printf(Message from the pipe is:%sn,buf);close(fd0);/* 關(guān)閉讀管道 */waitpid(pid,NULL,0);/* 待 pid 進(jìn)程退出,此處pid 為子進(jìn)程 */exit(0);else perror(fork() error!); exit(0);4、
8、普通管道只能用于一個(gè)進(jìn)程家族之間的通信,如父子,兄弟之間,并且普通管道在于內(nèi)存中,隨著進(jìn)程的結(jié)束而消失;而命名管道是有“名字”的管道,存在于磁盤(pán)上,作為一個(gè)特殊的設(shè)備文件而存在, 不會(huì)隨著進(jìn)程結(jié)束而消失。 有名管道可用于兩個(gè)無(wú)關(guān)的進(jìn)程之間的通信,實(shí)現(xiàn)函數(shù)是 mkfifo() 。下面的程序?qū)嵗菔玖?mkfifo 的使用。請(qǐng)先以超級(jí)用戶(hù)身份登錄系統(tǒng),然后編輯 /編譯源程序(兩個(gè) *.c 程序),在圖形終端上執(zhí)行讀程序 readfifo.c ,讀程序執(zhí)行后將陷入循環(huán);切換到字符終端1( ctrl+alt+f1 ),以超級(jí)用戶(hù)身份登錄并執(zhí)行寫(xiě)程序writefifo.c ,然后回到圖形終端,觀(guān)察讀程序
9、的輸出變化。/*readfifo.c*/#include#include#include#include#include#include#include#include#define FIFO /home/jkx/myfifo /*使用宏定義路徑*/int main()int fd;/* 指向命名管道 */ char buf100;/* 存儲(chǔ)數(shù)據(jù) */if(mkfifo(FIFO,O_CREAT|O_EXCL)0) /*創(chuàng)建管道 */perror(Create error!n); unlink(FIFO);/* 清除管道 */ exit(0);fd=open(FIFO,O_RDONL Y|O_NONBLOCK,0);/* 打開(kāi)管道 */ if(fd0)/*讀取管道 */ printf(Get message:%sn,buf); else printf(Not accept any message!n);sleep(1);/* 休眠 */*/*writefifo.c*/#include#include#include#include#include#include#include#define FIFO /home/jkx/myfifo /*宏定義命名管道路徑*/int main()char *msg=Som
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 甲苯精餾塔課程設(shè)計(jì)結(jié)論
- 網(wǎng)絡(luò)營(yíng)銷(xiāo)微信課程設(shè)計(jì)
- 醫(yī)院設(shè)備管理制度
- 波浪能發(fā)電裝置課程設(shè)計(jì)
- 舞蹈機(jī)構(gòu)古典舞課程設(shè)計(jì)
- 用天正暖通進(jìn)行課程設(shè)計(jì)
- 會(huì)計(jì)師工作總結(jié)細(xì)心核算確保賬目準(zhǔn)確無(wú)誤
- 數(shù)字時(shí)代品牌營(yíng)銷(xiāo)的新趨勢(shì)計(jì)劃
- 日常教學(xué)反思與總結(jié)計(jì)劃
- 裝修合同簡(jiǎn)易版
- 通力電梯KCE電氣系統(tǒng)學(xué)習(xí)指南
- 風(fēng)電場(chǎng)崗位任職資格考試題庫(kù)大全-下(填空題2-2)
- 九年級(jí)數(shù)學(xué)特長(zhǎng)生選拔考試試題
- 幼兒園交通安全宣傳課件PPT
- 門(mén)窗施工組織設(shè)計(jì)與方案
- 健身健美(課堂PPT)
- (完整版)財(cái)務(wù)管理學(xué)課后習(xí)題答案-人大版
- 錨索試驗(yàn)總結(jié)(共11頁(yè))
- 移動(dòng)腳手架安全交底
- 人教版“課標(biāo)”教材《統(tǒng)計(jì)與概率》教學(xué)內(nèi)容、具體目標(biāo)和要求
- 矩形鋼板水箱的設(shè)計(jì)與計(jì)算
評(píng)論
0/150
提交評(píng)論